2012-10-12 26 views
2

Android中的Bitmap內存問題導致我實現了一個自定義加載器和下載器類,它將從Web下載圖像,存儲本地副本,以及如果從本地副本請求創建Bitmap。我在SoftReference<T>列表保持這些使他們保持一會兒,然後垃圾回收,此時類的finalize()方法被稱爲:從終結器調用位圖#recycle()會導致Android應用程序無提示終止

protected void finalize() throws Throwable { 
    Log.w("IMAGEPACK", "Finalizing " + mBitmap); 
    if(mBitmap!=null&&!mBitmap.isRecycled()) mBitmap.recycle(); 
    super.finalize(); 
} 

看着logcat的,我確定這件的代碼正好在崩潰之前發生。我還介紹了代碼,它在這條線上失敗了。

我有一個解決方案,以前使用同步引用計數,它似乎很可靠,但在我想避免這種情況之前,手動編寫引用計數時遇到了很大的問題。我可能不得不恢復它,但我想知道爲什麼位圖回收在這裏失敗。

我目前正在2.3.3上對三星Galaxy S進行測試。

回答

0

如果您失去了參考Bitmap,您實際上不需要致電recycle()Bitmap類已經覆蓋finalize()並釋放內存,所以你所做的是多餘的。

此外,根據文檔本身:

這是一種先進的呼叫,並且通常不需要叫,因爲 正常GC過程中會釋放此內存時,有沒有更多的 引用這個位圖。

如果您不再需要位圖,但無論出於何種原因需要保留引用(也許您將超過您想保留的額外元數據重載Bitmap對象),則存在回收。如果你只是持有對Bitmap對象的引用,那麼解引用它就足夠了。

+0

非常感謝,但苦澀的經歷表明事實並非如此。我花了很長時間在另一個應用程序中追蹤內存泄漏,這些應用程序可追蹤到未循環的'Bitmap',我認爲在我停止引用它們時會收集垃圾。 –