2012-08-06 26 views
1

通常我總是在Imageviews中使用Drawable資源,因爲我沒有手動釋放它們。圖像資源如何回收?

但在某些情況下,我需要動態創建位圖,然後我必須在onDestroy()上手動調用recycle()。根據that other StackOverflow question,這是我找到的最佳解決方案。

我想了解Android如何管理Drawable資源以及爲什麼我不需要手動回收它們。理解後,看看是否可以將類似的邏輯應用於手動創建的位圖。

回答

0

A DrawableBitmap廣泛得多。 Drawable旨在表示圖形系統可以呈現給顯示器的任何內容。有Drawable的子類 - 例如ShapeDrawableColorDrawable - 不包含Bitmap,因此不需要任何手動內存管理。

A BitmapDrawable包裝Bitmap幷包含對Bitmap的引用。 Bitmap是特殊的,因爲Android將所有Bitmaps的像素數據保存在單獨的堆中,該堆與應用程序的其餘部分分開管理。當Android垃圾收集器清理一個Bitmap對象時,它還清理位圖堆中的像素數據。但是您可以通過Bitmap上的recycle()手動調用Bitmap無效並釋放其像素數據,從而更快地實現。

Android爲每個正在運行的應用程序分配一個固定大小的位圖堆,並且您的應用程序可能會耗盡太多太多的Bitmaps。這就是爲什麼如果您的應用程序廣泛使用位圖,只要您知道不需要它們,就可以從循環位圖中獲益。

更新:如註釋中所述,單獨的位圖堆適用於Android之前的Honeycomb版本。從Honeycomb開始,位圖堆與應用程序堆合併在一起。這是一個SO post with more info

+0

然後,如果我理解正確有任何「魔法」。如果我在onCreateView之後手動創建一個位圖並設置Imageview,我可以預期Android會以釋放由圖像資源創建的圖像的相同方式釋放它。 – lujop 2012-08-06 19:00:48

+1

只要您的Activity沒有任何引用手動創建的位圖(例如,在靜態字段或其他東西),它將被垃圾回收器和所有剩餘的View對象清理乾淨。如果您知道您不再需要位圖,並且想要爲其他位置釋放位圖堆,則recycle()方法很有用。 – mportuesisf 2012-08-06 19:04:58

+0

這是雖然蜂窩前,因爲蜂窩的位圖內存與應用程序的其餘部分在同一堆。 – Ixx 2012-08-06 19:09:22