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

问候, 亚历

相关问题