2011-06-08 42 views
2

我創建一個Android應用程序動態從Internet下載圖像,然後將它們放置到一個ImageView,允許用戶設置默認的圖像和高亮顯示的圖像。爲此,我下載數據並將其保存到文件中,每當需要映像時,我從該文件創建一個BitmapDrawable,並將它放在StateListDrawable中。當不再需要ImageView什麼是正確的方式來處置StateListDrawable所以我不泄漏內存,他們得到垃圾回收?我是否應該參考StateListDrawable中的每個BitmapDrawable,以便我可以給他們打電話回收?將StateListDrawable回調設置爲null會怎麼樣?或者是將ImageView設置爲空以便不泄漏內存?清理StateListDrawables

謝謝!

+0

我感興趣的是這一點。找到一種方式? – 2012-05-22 14:19:53

+0

一些代碼將有助於..位圖加載和設置代碼 – Ronnie 2012-05-23 19:03:36

+0

我認爲問題很明顯,您有一個按鈕或一些視圖,它們在StateListDrawable中包含多個位圖,並且您想要在完成後回收它們它目前我有一個「位圖」清潔類,我也傳遞位圖(包括他們的上下文)onDestroy,我用上下文調用位圖清理器,它將回收所有與該上下文相關的位圖。想知道是否有更好的解決方案。 – 2012-05-24 14:57:00

回答

2

的Java虛擬機將自動收集您不需要的StateListDrawable S的照顧。所有你需要做的就是確保有沒有辦法StateListDrawable本身可以從你的程序,或者通過重新分配引用到另一個Object,或者通過引用設置爲null引用。它甚至沒有問題,如果在StateListDrawable仍持有你想要保留對其他對象的引用(比如你討論的回調)...一旦Object不能被引用,它是符合垃圾回收。當虛擬機認爲它是釋放內存的好時機時,它會爲您刪除StateListDrawable,您無需擔心自己在任何對象上調用recycle()

一個簡單的方法,看看這個,如果你使用的是Eclipse是查看logcat的消息你的程序在模擬器中運行,同時編輯。偶爾會有消息說:「GC在xxx ms中釋放了xxx對象/ xxx字節。」

Java tutorials

「一些面向對象的語言要求,你讓你創建所有 對象的跟蹤和你明確地消滅他們,當他們 不再需要Java平臺允許您可以根據需要創建儘可能多的對象(當然,受限於您的系統可以處理的內容),而且您不必擔心將其銷燬。運行時環境在確定它們是對象時會刪除對象 不再使用這個過程被稱爲垃圾收集灰。當沒有更多的 引用到該對象

一個目的是進行垃圾回收。當變量超出範圍時,保存在變量中的參考文件通常是 。或者,您可以通過將變量設置爲 特殊值null來顯式刪除對象引用。請記住,一個程序可以有多個對同一個對象的 引用;對象的所有引用必須 下降前的對象符合垃圾收集「

編輯:從documentation爲「Bitmap.recycle()`,

「。不含原生對象與此位圖相關聯,並清除對像素數據的引用...這是一種先進的呼叫,通常 無需調用,因爲正常的GC過程中會釋放此 內存時有此位沒有更多的引用。」