2013-08-26 36 views
12

Bitmap.recycle() Android的參考文獻:使用後(在Android中)需要調用Bitmap.recycle()嗎?

免與該位圖相關聯的原生對象,並清除 參考像素數據。這不會同步釋放像素數據 ;它只是允許它被垃圾收集,如果 沒有其他參考。位圖被標記爲「死」,這意味着如果調用getPixels()或setPixels(),則 將引發異常,並且 將不會繪製任何內容。該操作不能顛倒,因此只有在確認 位圖沒有其他用途時才應調用 。 這是一個高級調用,通常不需要調用, ,因爲當沒有對此位圖的更多引用時,正常的GC進程將釋放此內存。

但是,許多書我讀了建議,以釋放內存調用Bitmap.recycle()一旦確定不再需要它。

它讓我感到困惑:使用後需要撥打Bitmap.recycle()嗎?

+2

GC在未使用時會釋放位圖,但調用'recycle()'將有助於GC檢查內存的這部分是否空閒。在加載和卸載位圖時(如在列表或庫中)調用'recycle()'可能是一種好的做法 –

回答

1

這是沒有必要的,但強烈推薦!它將加快內存釋放過程,並將爲您節省Out Of Memory異常的折磨。

如果您打算對位圖進行任何嚴重的內存大量工作,我會說它是強制性的。

0

之前的Android 3.0位圖分配本地內存來存儲它的像素,並且recycle()調用在該區域中刪除。

即使有GC,如果還有任何引用,GC不保證釋放該內存。

但是這個調用看起來可以幫助GC工作得更好,我開發了一個應用程序,可以廣泛使用內存,並在較新的設備上運行,調用該應用程序或不運行應用程序幾乎相同(對於較老的程序,它確實可以提高某些性能) 。

17

這取決於。

如果您在Android 3.0及更高版本上運行您的應用程序,則不需要,因爲GC將完美地處理它。但是,如果您在舊版本上運行應用程序,由於位圖不能很好地被GC監控(它認爲它們是參考文件的大小),您可以獲得OOM,如Google IO講稿here

無論如何,仍然建議您一旦確定不再需要位圖就立即調用回收站。它甚至可以用於新的android版本,因爲它降低了自動內存管理所需的工作量......

其實,我記得我已經問了一個類似的問題here

此外,如果您需要使用JNI對位圖進行額外控制,請查看this post

所以,總之,答案是它不再需要,但仍然建議。

相關問題