2010-07-05 543 views
5

我已閱讀了一些關於延遲加載的文章,但我相信我的問題有點不同。Android:在圖庫中的延遲加載

我有一個畫廊(我的班級擴展畫廊),其中顯示20個相當大的圖像(每個400-500K)。自從出現OutOfMemory異常後,我無法將它們全部加載到庫中。
因此,我創建了20個Drawable的數組,並且最初填充了前9個元素(圖像來自Web),並將所有其餘元素設置爲null。我的意圖是這樣的:在右邊的一個扔,取元素沒有。 10並設置爲空元素號。 0.在另一個正確的提取元素沒有。 11並設置爲空元素號。 1爲null。同樣的邏輯放在左邊。

問題是我可以扔掉比元素更快的速度。 我的展廳有一個BaseAdapter及其getView()看起來是這樣的:

 
public View getView(int position, View convertView, ViewGroup parent){ 
    ImageView imageView = new ImageView(); 
    imageView.setDrawable(imageArray[position]; 
    .... 
    .... 

    return imageView; 
} 

我如何告訴getView() - 如果imageArray [位置]仍是空,顯示「正在加載...」對話框,一旦它被設置重複自己與相同的位置?
我不想看到imageView爲空,然後立即設置。我希望在設置之前無法看到imageView。

謝謝。

+1

在Android博客上有一篇很棒的文章(以及一些示例代碼)可以回答您的問題:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – Ally 2011-10-18 21:05:42

回答

6

畫廊專爲順暢的體驗而設計。如果您屏蔽了屏幕並且在取出之前不切換到下一張圖像,那麼這將會是非常糟糕的用戶界面。這種方式用戶將無法一蹴而就。加載時應顯示一些加載指示符而不是圖像。

我認爲你的情況相當普遍。你應該下載圖像並顯示它們。如果您使用OutOfMemory,則可以嘗試超級採樣圖像Strange out of memory issue while loading an image to a Bitmap object

如果仍然存在OutOfMemory,則應從內存中刪除位圖並將其緩存到SD。所以當用戶回來時,你可以再次從SD加載圖像,它會足夠快。內存消耗會更低。正如你所建議的,你可以將10個最新的圖像緩存在內存中,而其他圖像緩存在SD上。

你可以看看我的示例代碼Lazy load of images in ListView。實際上它是一個ListView適配器,但您可以稍微修改將其應用於畫廊。我認爲它會完全符合你的需求。

+0

Thanks Fedor 。將嘗試... – Rob 2010-07-06 07:49:41

+0

「您應該在加載時顯示一些加載指示符而不是圖像。」 我該如何做到這一點?我知道如何在畫廊前面的ProgressDialog中放置加載指示器,但是如何將指示器而不是圖像本身?只是爲了提醒你,imageView是在運行時創建的。如果它是在XML中定義的,我可以將它分配給一個默認源,但這裏不是這種情況......謝謝。 – Rob 2010-07-06 13:47:04

+1

這不是問題。您可以在運行時創建ProgressControl而不是ImageView。或者,您可以在運行時創建ImageView,並在下載實際圖像時顯示一些存根圖像。我在示例代碼中顯示存根圖像。 – Fedor 2010-07-06 15:09:54