如何回收位图并在以后再使用它?

时间:2012-07-09 08:21:17

标签: android memory bitmap

我必须释放位图占用的内存。所以当我的活动结束时,我正在对所有人进行recycle()调用。

这些位图总是在drawable中使用,作为背景属性或源(ImageView)属性的情况。

但问题是,当后来另一个活动有一个也使用这些位图的视图时,它会显示

  

java.lang.RuntimeException:Canvas:尝试使用循环位图。

我能做什么,我无法将位图保留在内存中只是因为可能用户在某个时间点开始使用它们的活动。如何告诉位图释放内存,请稍后再使用?

3 个答案:

答案 0 :(得分:2)

解决方案是使用以下方法初始化Bitmap和View:

Bitmap b = BitmapFactory.decodeResource(resources, R.drawable.mybitmap);
view.setBackgroundDrawable(new BitmapDrawable(b));

虽然这对XML位图不起作用。但是位图应该可以从视图中检索。

将位图实例放在内存中,可以在其上调用recycle()来立即释放内存。

回收位图之前,必须确保它不再被任何视图引用 - 将drawable / view的引用设置为null。否则将抛出异常。为了做到这一点,有必要跟踪引用位图的视图,并在回收之前将所有引用置空。

所以我的实际问题是没有重用位图。问题是回放位图,同时仍然被视图引用。

答案 1 :(得分:0)

如果您使用的Bitmap用于Drawableandroid:source ImageView,那么为什么你有Bitmap个对象呢? Android会在这些情况下使用最佳内存,而且根本不需要调用recycle()

答案 2 :(得分:0)

您可以使用bitmap.isRecycled()检查位图是否已回收。如果此方法返回true,则可以重新初始化位图。像这样:

if(bitmap != null && bitmap.isRecycled()) {
  //Reinitialize the image
}
else {
  //The bitmap is not recycled, you can use it
}