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

标签 android memory bitmap

我必须释放位图占用的内存。因此,当我的 Activity 完成时,我会对所有这些调用 recycle()

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

但问题是,当稍后另一个 Activity 有一个也使用这些位图的 View 时,它将显示

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap.

我能做什么,我无法将位图保留在内存中,只是因为也许用户在稍后的某个时刻启动了使用它们的 Activity 。我如何告诉位图释放内存并稍后可以再次使用?

最佳答案

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

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

但这不适用于 XML 位图。但位图应该可以从 View 中检索。

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

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

所以我的实际问题不是重用位图。问题是回收位图,同时仍被 View 引用。

关于android - 如何回收位图并在以后再次使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11391346/

相关文章:

Ruby 内存使用情况 : Methodical Loop Versus Built In Loop

c++ - 堆内存为何产生?

java - 确定我的应用程序使用了多少内存

android - 如何设置 float 操作按钮图像填充按钮?

Android - 如何衡量 ListView 和其他 View 的性能?

Android textview 阴影不能使用 style.xml

android - 在使用 picasso 将图片调整为 imageview 后,如何获取图片的结果位图

java - 如何强制invalidate()?

c# - BitmapSource 和 Bitmap 之间有什么好的转换方法吗?

android - API8 至 7 兼容性