何时(如果有的话)我应该使用Bitmap.recycle()?

时间:2012-06-26 07:09:53

标签: android bitmap garbage-collection out-of-memory android-imageview

根据 Android开发者网站,Bitmap.recycle()方法定义为:

  

释放与此位图关联的本机对象,并清除对像素数据的引用

我开发了一些创建/解码大量位图的应用程序,并将结果位图对象放到ImageView s。有时我会遇到一些着名的例外情况,例如:

  

位图大小已超出预算

  

内存不足错误

此外,我确信我没有任何可能导致此问题的内存泄漏。

经过大量搜索后,我发现了“循环”方法,并在不再需要时使用它来释放位图的本机内存。 好像有很多帮助

我问这是不是我应该在这种情况下做的事情,因为 我知道系统无论如何都没有明确地调用它(是吗?也许我错了)。

我应该在这种情况下使用这种方法吗?

我应该在什么情况下使用这种方法?

我应该使用这种方法吗?

提前感谢。

更新

最近谷歌发布了this指南,其中说:

  

在Android 2.3.3(API级别10)及更低版本上,建议使用recycle()。如果您在应用中显示大量位图数据,则可能会遇到OutOfMemoryError错误。 recycle()方法允许应用程序尽快回收内存。

2 个答案:

答案 0 :(得分:3)

  

在什么情况下我应该使用这种方法?

当GC确定时,GC会对GC进行GC操作。但在某些情况下,它可能会延迟。 并且始终记住java中的拇指规则(也许它也适用于其他P.L.)GC回收物体的速度可能与创建物体的速度不同。所以GC有时候回收的速度很慢。

所以recycle()表示如果你想尽快释放内存,你应该调用recycle()

  

我应该使用这种方法吗?

这是一个高级调用,通常不需要调用,因为正常的GC进程会在没有更多对此位图的引用时释放此内存。但是如果您遇到超出位图大小的问题vm预算内存不足错误,那么您需要使用此功能。

答案 1 :(得分: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;
  }

在那样的地方,我确定我不会使用面具或contactImage。

我找到了一个非常好的位图处理资源,可以帮助Displaying bitmaps

此致 亚历