9

Android開發者現場,Bitmap.recycle()方法定義是:什麼時候(如果有的話)我應該使用Bitmap.recycle()?

釋放與此相關的位圖的原生對象,並清除參考像素數據

我已經開發了一些正在創建/解碼大量位圖的應用程序,並將結果位圖對象置於ImageView s。有時候,我已經得到了著名的例外,如:

位圖大小excceded VM預算

內存不足的錯誤

而且我敢肯定我沒有任何內存泄漏可以導致這種情況。

經過大量搜索之後,我發現了「回收」方法,並在不再需要時使用它來釋放位圖的本機內存。 看起來好像幫了很多。我想知道這是我應該做的這種情況,因爲 我知道系統是這樣做的,不用明確地調用它(是嗎?也許我錯了)。

我應該在這種情況下使用這種方法嗎?

在什麼情況下我應該使用這種方法?

我應該使用這種方法嗎?

在此先感謝。

UPDATE:

谷歌張貼this導向最近,這表示:

在Android 2.3.3(API級10)和下,使用循環()的建議。如果您在應用中顯示大量的位圖數據,則可能會遇到OutOfMemoryError錯誤。 recycle()方法允許應用程序儘快回收內存。

+5

這是沒有必要叫'recyle'。它可以幫助,但只有當你正確使用它時。實際上,爲你的'Bitmap'對象創建一個'WeakReference'並且返回它就容易多了。 [你應該看這個谷歌IO談話](http://www.youtube.com/watch?v=_CruQY55HOk) – adneal

+0

@aneal:謝謝,很久以前已經看過這個視頻。 –

回答

3

在什麼情況下我應該使用這種方法?

每當它決定時,位圖都由GC進行GC處理,但在某些情況下可能會延遲。 在java中總是記得拇指規則(也許它也適用於P.L.)。通過GC回收對象的速度可能與創建對象的速度不同。因此,有時GC回收速度很慢。

所以回收()是指如果你想釋放內存儘快與您應該調用循環()

我應該用這種方法在所有?

這是一種先進的呼叫,並且通常不需要叫,因爲正常的GC進程將釋放該內存的時候有這個沒有更多的引用bitmap.But如果你正面臨着像位圖大小問題超出虛擬現實內存不足錯誤那麼你需要使用這個。

0

我在使用它的操作中知道位圖不會再被使用。

public static Bitmap getMaskedContactImage (Context context, Bitmap contactImageBitmap, int maskToBeApplied) { 
    Bitmap mask = BitmapFactory.decodeResource(context.getResources(), maskToBeApplied); 
    Bitmap output = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Config.ARGB_8888); 
    final Rect finalRect = new Rect(0, 0, contactImageBitmap.getWidth(), contactImageBitmap.getHeight()); 
    final Rect originRect = new Rect(0, 0, mask.getWidth(), mask.getHeight()); 
    Canvas canvas = new Canvas(output); 

    Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    xferPaint.setColor(Color.BLACK); 

    xferPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

    canvas.drawBitmap(contactImageBitmap, finalRect, originRect, null); 
    canvas.drawBitmap(mask, originRect, originRect, xferPaint); 

    contactImageBitmap.recycle(); 
    mask.recycle(); 

    return output; 
    } 

在這樣的地方,我確定我不會使用mask或contactImage。

我發現了一個非常好的位圖處理資源,可以幫助完成Displaying bitmaps

問候, 亞歷

相關問題