2012-11-30 27 views
2

在Android pre-honeycomb上,Bitmap具有奇怪的內存問題,因爲它們的數據未存儲在VM中。因此它不會被GC跟蹤或刪除。相反,當Bitmap.recycle()被調用(並且這也在Bitmap的終結器中自動完成)時被移除。引用計數android帶高速緩存的位圖

這會導致圖像緩存時出現問題。當位圖將被驅逐時,我不能簡單地調用recycle(),因爲我不知道其他人是否正在使用它。

我的第一個想法是在加載每個位圖之前做System.gc()。這樣,希望孤兒Bitmap將最終確定和本地內存釋放。但是it doesn't work編輯:其實它確實有點工作。我把我的System.gc()放在錯誤的地方,移動它之後,將緩存大小減半(看起來像是一個非常小的2MB未壓縮的位圖數據),我的應用程序似乎不再崩潰(到目前爲止)!

我的下一個念頭,就是實現人工引用計數,通過繼承Bitmap,並呼籲所有我的活動onDestroy()方法ReferenceCountedBitmap.decrementCount()。但我不能因爲Bitmap是最終的。

我現在計劃BitmapManager這使WeakReference的對位圖,並具有類似的方法:

public void using(Bitmap bm); 
public void free(Bitmap bm); 

這算引用。

有沒有人有任何經驗或建議處理這個?在你提出這個建議之前,我不能忽視80%的市場。

回答

0

好吧,我用一個位圖管理器解決了這個問題,我保存了引用視圖。在類似地圖的結構位圖 - >視圖列表中。

在我在位圖上調用recycle()之前,我首先將視圖中的所有引用設置爲null(否則它將拋出位圖再循環異常)。

正如你所說的,手動垃圾回收不適用於蜂窩前位圖,因爲它們分配在本機堆中,即使在System.gc()中也無法做出假設,因爲此內存將被釋放。