我必须释放位图占用的内存。因此,当我的活动结束时,我会召集recycle()
他们所有人。
这些位图始终在可绘制对象中使用,作为背景属性或源(大小写ImageView
)属性。
但问题是,当稍后另一个活动的视图也使用这些位图时,它会显示
java.lang.RuntimeException: Canvas: 试图使用回收的位图。
我能做什么,我不能将位图保留在内存中,因为也许用户稍后会启动一个使用它们的活动。我如何告诉位图释放内存并且以后可以再次使用?
解决方案是使用以下方法初始化位图和视图:
Bitmap b = BitmapFactory.decodeResource(resources, R.drawable.mybitmap);
view.setBackgroundDrawable(new BitmapDrawable(b));
虽然这不适用于 XML 位图。但是位图应该可以从视图中检索。
将位图实例放在内存中,可以在其上调用 recycle() 以立即释放内存。
在回收位图之前,必须确保它不再被任何视图引用 - 将可绘制/视图的引用设置为 null。否则会抛出异常。为了做到这一点,有必要跟踪引用位图的视图,并在回收之前将所有引用清空。
所以我的实际问题不是重用位图。问题是在视图仍然引用位图时回收位图。
如果你用Bitmap
s 代表的只是Drawable
s 和android:source
of ImageView
s,那你为什么还要有Bitmap
对象呢?在这些情况下,Android 将负责优化内存使用,根本不需要调用recycle()
。
您可以检查位图是否被回收bitmap.isRecycled()
。如果此方法返回 true,您可以重新初始化位图。像这样的东西:
if(bitmap != null && bitmap.isRecycled()) {
//Reinitialize the image
}
else {
//The bitmap is not recycled, you can use it
}