2011-06-07 20 views
9

我處於使用for循環下載一組圖像並將其轉換爲位圖圖像的情況。所以爲了避免OutOfMemory錯誤,我試圖回收這個位圖。但不幸的是,我遇到了另一個異常,如"View trying to use a recycled bitmap"Diff b/w bitmap.recycle()和位圖= null

但我仍然允許通過使用bitmap=null來清空已使用的位圖。所以我的問題是,將使我的位圖null幫助我釋放使用的內存?或者我應該在我的代碼的其他部分提供bitmap.recycle()

+1

followin g鏈接提供了更多關於位圖內存管理的信息:http://stackoverflow.com/questions/4959485/bitmap-bitmap-recycle-weakreferences-and-garbage-collection – 2013-09-24 01:15:52

回答

7

調用recycle()向系統表明您已完成使用該資源,並且系統現在可釋放其正在使用的非託管內存。一旦你以這種方式處理了資源,它的行爲通常是不確定的(人們會合理地期望它不再工作)。

設置事後空基準有兩個好處:

  • 你不會有對象的過時引用當您嘗試使用它們
  • 垃圾收集器將知道要清理,將無法正常工作釋放更多的內存
7

沒有保證強制垃圾回收的方法,只有一種方法來建議使用System.gc()。由於位圖像素數據位於達爾維克堆之外的本機存儲器中,因此提供本地函數(在本例中爲recycle())將使我們有機會清除(最終)該像素數據。請注意,當使用recycle()時,用該位圖可以做的事情就不多了。

您遇到的問題是您在位圖上調用recycle(),您仍在嘗試使用該位圖。

要回答你的問題,是的,你已經回收它後設置位圖是一個好主意,但它也可能是多餘的。當你完成它們時,總是嘗試回收你的位圖。

+4

'總是嘗試回收你的位圖當你完成它們'這是我的問題。我應該在哪裏提供回收。如果我嘗試在for循環中提供應用程序崩潰。但我想盡可能多地回收利用。那麼我可以在哪裏準確地使用我的回收方法。 – 2011-06-07 06:08:34

-3

只是在onStop方法上調用bitmap.recycle()............. u將解決問題..

+0

這是錯誤的!除非你知道'recycle()'做了什麼。 – Varun 2013-08-30 00:08:33