2011-11-02 76 views
20

我的應用程序可以加載相當大的圖像。在努力爲內存保守,我試圖用一個臨時的位圖加載,另一個用於改造後的最終圖像:現在Android:「嘗試使用回收位圖」錯誤與臨時位圖

..... 
finalBitmap.recycle(); 
finalBitmap = null; 
Bitmap tempBitmap = BitmapFactory.decodeStream(fin, ...); 
finalBitmap = Bitmap.createBitmap(tempBitmap, ....); 
imgview.setImageBitmap(finalBitmap); 
..... 

,在這一點上我們與tempBitmap,這是做只需要將解碼的位圖傳輸到createBitmap中的轉換步驟即可。所以:

..... 
tempBitmap.recycle(); 
tempBitmap = null; 
..... 

而且...它試圖使用一個回收的位圖錯誤,具體是因爲tempBitmap的回收。 tempBitmap沒有顯示,僅在處使用

這裏怎麼回事?我應該用 「finalBitmap」 貫穿並依靠createBitmap對其進行管理(finalBitmap = Bitmap.createBitmap(finalBitmap,....))?我無法看到將會導致這樣的失敗的tempBitmap的持續依賴。

編輯:是的,空的分配似乎得到適當的,最終垃圾收集,但我很迷惑,爲什麼再循環()上的臨時位圖是在這種情況下,這樣的問題。我得到的印象是createBitmap()持有對它的引用,但爲什麼以及多久?

回答

25

直從Android documentation

返回從源 位圖的指定子集的不可變位圖。新的位圖可能與源相同,或者可能有複製品 。

似乎createBitmap函數有可能重用您提供的位圖。如果是這種情況,那麼您應該不會回收臨時位圖,因爲您的最終位圖正在使用它。你可以做的一件事是

if(tempBitmap != finalBitmap) { 
    tempBitmap.recycle(); 
} 

這應該只是回收tempBitmap,當它不是finalBitmap相同。至少這似乎是文檔所暗示的。

+1

我錯過了它可能是同一個對象的一點。我將temp設置爲null不會導致副作用,因爲它不會真正釋放對象,而recycle()直接影響它。嗯。我接受你的答案,並希望你能幫我加強我的問題(因爲我認爲這對於人們來說是有用的信息)。 – MartyMacGyver