通常我總是在Imageviews
中使用Drawable
資源,因爲我沒有手動釋放它們。圖像資源如何回收?
但在某些情況下,我需要動態創建位圖,然後我必須在onDestroy()
上手動調用recycle()
。根據that other StackOverflow question,這是我找到的最佳解決方案。
我想了解Android如何管理Drawable
資源以及爲什麼我不需要手動回收它們。理解後,看看是否可以將類似的邏輯應用於手動創建的位圖。
通常我總是在Imageviews
中使用Drawable
資源,因爲我沒有手動釋放它們。圖像資源如何回收?
但在某些情況下,我需要動態創建位圖,然後我必須在onDestroy()
上手動調用recycle()
。根據that other StackOverflow question,這是我找到的最佳解決方案。
我想了解Android如何管理Drawable
資源以及爲什麼我不需要手動回收它們。理解後,看看是否可以將類似的邏輯應用於手動創建的位圖。
A Drawable
比Bitmap
廣泛得多。 Drawable
旨在表示圖形系統可以呈現給顯示器的任何內容。有Drawable
的子類 - 例如ShapeDrawable
或ColorDrawable
- 不包含Bitmap
,因此不需要任何手動內存管理。
A BitmapDrawable
包裝Bitmap
幷包含對Bitmap
的引用。 Bitmap
是特殊的,因爲Android將所有Bitmaps
的像素數據保存在單獨的堆中,該堆與應用程序的其餘部分分開管理。當Android垃圾收集器清理一個Bitmap
對象時,它還清理位圖堆中的像素數據。但是您可以通過Bitmap
上的recycle()
手動調用Bitmap
無效並釋放其像素數據,從而更快地實現。
Android爲每個正在運行的應用程序分配一個固定大小的位圖堆,並且您的應用程序可能會耗盡太多太多的Bitmap
s。這就是爲什麼如果您的應用程序廣泛使用位圖,只要您知道不需要它們,就可以從循環位圖中獲益。
更新:如註釋中所述,單獨的位圖堆適用於Android之前的Honeycomb版本。從Honeycomb開始,位圖堆與應用程序堆合併在一起。這是一個SO post with more info。
然後,如果我理解正確有任何「魔法」。如果我在onCreateView之後手動創建一個位圖並設置Imageview,我可以預期Android會以釋放由圖像資源創建的圖像的相同方式釋放它。 – lujop 2012-08-06 19:00:48
只要您的Activity沒有任何引用手動創建的位圖(例如,在靜態字段或其他東西),它將被垃圾回收器和所有剩餘的View對象清理乾淨。如果您知道您不再需要位圖,並且想要爲其他位置釋放位圖堆,則recycle()方法很有用。 – mportuesisf 2012-08-06 19:04:58
這是雖然蜂窩前,因爲蜂窩的位圖內存與應用程序的其餘部分在同一堆。 – Ixx 2012-08-06 19:09:22