2012-08-14 35 views
5

我知道,在Android的API 10之前,因爲實際的原始數據存儲在本機內存中,所以重要的是要調用recycle(),因爲Bitmap不再使用。API 11+上的調用bitmap.recycle()是做什麼的?

然而,隨着API 11,Bitmap s的存儲在堆中,所以我的問題是:

它仍然需要呼籲Bitmap小號recycle()如果API是足夠大(至少11)?如果我在這樣的API上調用它,它會做什麼?

+0

當你說「在API 10之前調用recycle()很重要」這是否意味着如果你不存儲內存將永遠不會被釋放?官方文檔說這是「推薦」,但如果它在本地內存中分配位圖,我不明白如何在沒有調用recycle()的情況下釋放它。 – Tiago 2014-10-12 23:02:27

+0

@Tiago您可以觀看此演講:https://www.youtube.com/watch?v=_CruQY55HOk#t=656。位圖在堆中佔據了非常小的空間,但是它們的像素數據沒有(仍然是堆的OOM機制的一部分),所以GC不知道情況有多好/多壞,如果不是這樣, t在創建多個位圖時觸發,您可以輕鬆獲得OOM。這就是爲什麼說「回收」很重要,以便它儘快清除位圖(因爲GC沒有很好地完成工作)。 – 2014-10-13 06:43:25

+0

啊,我明白了。這解釋了很多。非常奇怪的是,OutOfMemory異常會計算堆和本地內存,而GC只會查看堆。一旦從Honeycomb +位圖的像素數據也在堆中,那麼GC就可以完成它的工作。真是一團糟,嘿嘿!謝謝澄清! – Tiago 2014-10-13 20:03:00

回答

5

官方文檔告訴我recycle()現在是一個高級調用,所以如果你想釋放你的位圖,你可以寫一些像bitmap = null這樣的東西,GC會處理所有其他事情。

+0

我懂了 。所以回收仍然會立即釋放它的記憶? – 2012-10-18 23:00:57

+0

是的,回收將釋放內存不看GC,所以你必須小心這個電話。 – s0nicYouth 2012-10-22 17:47:32

相關問題