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

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

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

我已经开发了一些应用程序,它们正在创build/解码许多位图,并将结果位图对象放到ImageView 。 有时我会遇到一些着名的例外,例如:

位图大小突出vm预算

内存不足错误

此外,我敢肯定,我没有任何内存泄漏,可以导致这一点。

经过大量search之后,我发现了“回收”方法,并在不再需要时使用它来释放位图的本地内存。 这看起来很有帮助

我问,如果这是我应该做的这种情况,因为我知道系统是这样做,而不明确调用它(是吗?也许我错了)。

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

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

我应该使用这个方法吗?

提前致谢。

更新:

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

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

Solutions Collecting From Web of "什么时候(如果有的话)我应该使用Bitmap.recycle()?"

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

无论何时决定,位图都由GC进行GC处理,但在某些情况下可能会延迟。 而且总是记得Java中的拇指规则(也许它也适用于其他的PL)。由GC回收对象的速度可能与创build对象的速度不一样,所以有时候GC在循环中的速度很慢。

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

我应该使用这个方法吗?

这是一个高级的调用,通常不需要调用,因为正常的GC进程会释放这个内存,当没有更多的引用这个位图。但是,如果你面临的问题,如位图大小超过VM预算内存不足错误,那么你需要使用这个。

我确实使用它在操作中,我知道位图将不会被使用了。

 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。

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

问候,亚历克斯