2

我必须释放位图占用的内存。因此,当我的活动结束时,我会召集recycle()他们所有人。

这些位图始终在可绘制对象中使用,作为背景属性或源(大小写ImageView)属性。

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

java.lang.RuntimeException: Canvas: 试图使用回收的位图。

我能做什么,我不能将位图保留在内存中,因为也许用户稍后会启动一个使用它们的活动。我如何告诉位图释放内存并且以后可以再次使用?

4

3 回答 3

2

解决方案是使用以下方法初始化位图和视图:

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

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

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

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

所以我的实际问题不是重用位图。问题是在视图仍然引用位图时回收位图。

于 2012-07-22T22:15:37.833 回答
0

如果你用Bitmaps 代表的只是Drawables 和android:sourceof ImageViews,那你为什么还要有Bitmap对象呢?在这些情况下,Android 将负责优化内存使用,根本不需要调用recycle()

于 2012-07-09T08:25:51.827 回答
0

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

if(bitmap != null && bitmap.isRecycled()) {
  //Reinitialize the image
}
else {
  //The bitmap is not recycled, you can use it
}
于 2012-07-09T08:40:47.040 回答