2012-10-27 16 views
1

我已經創建瞭如下的位圖,如何有效回收根據以下代碼創建的位圖?

// create bitmap in the below line Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.googlelogo320x480); 我已經將它設置爲一個ImageView。

我的問題是: 1>我是否需要顯式調用Bitmap.recycle()以上的位圖? 2>如果是,那麼我應該什麼時候打電話?我試着在第三行之後立即調用它,即將位圖設置爲ImageView之後,但是我得到一個Canvas試圖繪製回收對象的異常。 3>如果recycle()從未在我的代碼中的Bitmap上調用,是否會發生內存泄漏? P.S:我正在ICS或以上工作。

+0

使用'BitmapOptions' - (?)'inSampleSize',以減少你對加載內存的大小。這將避免OOM,直到它被OS釋放。 – Doomsknight

回答

4

在這種特殊情況下,不,你不應該叫再循環();當它完成後,ImageView將調用recycle()。這一直是事實,ICS沒有做任何改變這一事實。

你需要調用循環()當你的代碼與圖像來完成。例如,如果您將10個過濾器應用於一個圖像並在每個步驟中生成一個新的位圖,則應在每個步驟後在舊的位圖上調用recycle()。

這就是說,你不能有位圖無限數量的同時,特別是大型企業。那時候你需要聰明的動態加載/卸載。

+0

感謝您的回答,所以我認爲我創建並添加到ImageView的位圖不需要自行回收,只要我不將ImageView更改爲不同的位圖。一旦視圖消失或在方向更改期間,ImageView本身將在我的位圖上調用回收站。我的理解是否正確?還有什麼工具/方法來查找位圖內存泄漏? – Guna

+0

另一個快速問題,bmp = null&bmp.recycle()有什麼區別?我用過bmp = null;在位圖設置爲ImageView後立即進行,此更改沒有發現崩潰。但是,當我設置ImageView後調用bmp.recycle()時,它會崩潰,說畫布試圖繪製回收的位圖。是bmp = null,設置真的需要? – Guna

+0

'bmp = null'只是告訴系統你不再需要位圖。只要GC啓動,內存就會被釋放。如果你調用'recycle()'來立即釋放內存。 – dmon

0

試試這個

if (myBitmap != null) { 
    myBitmap.recycle(); 
    myBitmap = null; 
} 
Bitmap original = BitmapFactory.decodeFile(myFile); 
myBitmap = Bitmap.createScaledBitmap(original, displayWidth, displayHeight, true); 
original.recycle(); 
original = null; 
+0

我的問題是它真的需要在ICS或更高版本的Android上。另外如果需要,那麼應該何時調用?一個活動的onDestroy()會太晚,因爲那時我會運行OOM異常 – Guna

2

不調用循環()將導致內存泄漏,但它可能導致您的應用程序來走了過來內存限制和爆炸,請參閱下面來看看是否您的應用程序資格:

  1. 如果你只在ICS興趣及以上,你不應該需要擔心調用循環(),作爲位圖的實際備份數據存儲在Dalvik的控制內存。因此,只要你不保留對Bitmap的引用,Dalvk應該能夠正確使用它。
  2. 即使您希望支持Android 2.3或之前的版本,Bitmap將會最終發佈,所以如果您的應用不是Bitmap密集型的,您也不必擔心它。
  3. 但是,如果你是支持的Android 2.3或之前,並使用大量位圖,那麼你就應該儘快,因爲它是做回收的位圖。
+0

是的,我在我的應用程序中使用了很多位圖,所以即使使用ICS或更高版本,我可能需要調用回收站。同樣在你的第一點中「因此,只要你不保留對位圖的引用,Dalvk應該能夠正確地進行GC處理。」不要保持參考意思?我將每個位圖設置爲Imageview,基於方向更改或每當需要更新圖像時我都會在for循環中再次創建新的Imageview和新位圖實例。 – Guna

+0

如果您的代碼中無處引用ImageView,那麼它將在不確定的時間由Android發佈。如果要在for循環中分配很多位圖,則可以嘗試在for循環之前放置_System.gc()_,然後在實際設備上進行測試以確定是否確實遇到了OoM。 – Kai

+0

我已經遇到了一個OOM不在這個活動中的一些其他文件,它將被我的活動調用觸發。在那個文件中,他們正在嘗試創建一個新的Bitmap,這就是它拋出OOM的地方。 – Guna