11

根据Android Developers site,Bitmap.recycle()方法定义是:

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

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

位图大小超出虚拟机预算

内存不足错误

此外,我确定我没有任何可能导致这种情况的内存泄漏。

经过大量搜索,我发现了“回收”方法,并在不再需要时使用它来释放位图的本机内存。 好像帮了大忙

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

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

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

我应该使用这种方法吗?

提前致谢。

更新:

谷歌最近发布了这个指南,上面写着:

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

4

2 回答 2

3

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

位图在 GC 决定时由 GC 进行 GC。但在某些情况下,它可能会延迟。并且永远记住java中的拇指规则(也许它也适用于其他PL)。GC回收对象的速度可能与创建对象的速度不同。所以有时GC回收速度很慢。

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

我应该使用这种方法吗?

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

于 2012-06-26T07:26:59.537 回答
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。

我发现了一个非常好的位图处理资源,它可以帮助显示位图

问候,亚历克斯

于 2012-06-26T07:28:28.307 回答