2015-09-16 35 views
0

這裏看看下面的代碼,回收位圖中環

for (String path : all_path) { 
    bmp = BitmapFactory.decodeFile(path); 
    bitmapList.add(bmp); 
} 

這個代碼是推動我瘋了。由於在每次迭代中調用BitmapFactory.decodeFile(路徑)並將結果驅動到內存中,結果發生OutOfMemory異常。我試圖在解碼新位圖之前在循環中使用recycle()舊位圖,但這意味着沒有意義。我搜索了關於在循環中使用位圖的答案,但未能找到答案。我該怎麼辦?任何人請幫助。

回答

0

您正在將所有位圖添加到列表中。但是,對於所有位圖,您都使用相同的參考變量bmp,因此在每次迭代中它們將被替換。

但在列表中所有的位圖被添加。如果有許多位圖,那麼它最終會導致OutOfMemoryError

最好不要在列表中添加所有位圖。

+0

你的要求。「但是,你正在使用相同的參考變量BMP那麼在每次迭代中,他們得到更換所有位圖」很奇怪。函數'decodeFile'每次循環都會返回一個新的對象。 List對象保留對每個位圖的分隔符引用。 –

+0

@JaromírAdamec我只是想說,如果OP要在循環中處理位圖,然後轉到下一個位圖。那麼就不會有問題。由於引用變量將指向下一個位圖對象,並且較早的變量符合GC的條件。但是,由於OP將所有位圖添加到列表中,所以它是問題的原因。 – gprathour

0

嘗試回收未使用的位圖。 如果您使用所有位圖,而不是將它們添加到緩存並稍後使用它們。
接下來,當你想要替換一個,你將只替換一個不是全部。
從下面的變化需要更多的工作,但它的作品,因爲我用了很多位圖。
請看看這裏:
我實現了一次這樣的事情:
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

0

位圖可以是巨大的。爲什麼你需要把它們全部讀到內存中?通常情況下,您會按需閱讀每個位圖。或者,您可以讀取縮略圖,這些內存要求要低得多(BitmapFactory使您可以在閱讀時縮小位圖尺寸 - 使用BitmapFactory.Options,成員inSampleSize)。

閱讀:http://developer.android.com/training/displaying-bitmaps/index.html