Android:"尝试使用回收的位图"错误与临时位图

Mar*_*ver 20 android memory-management bitmap recycle

我的应用可以加载非常大的图像.为了保持记忆保守,我试图在转换后使用临时位图加载另一个用于最终图像:

.....
finalBitmap.recycle();
finalBitmap = null;
Bitmap tempBitmap  = BitmapFactory.decodeStream(fin, ...);
finalBitmap = Bitmap.createBitmap(tempBitmap, ....);
imgview.setImageBitmap(finalBitmap);
.....
Run Code Online (Sandbox Code Playgroud)

现在,我们已经完成了tempBitmap,只需要将解码后的Bitmap传输到createBitmap中的转换步骤.所以:

.....
tempBitmap.recycle();
tempBitmap = null;
.....
Run Code Online (Sandbox Code Playgroud)

并且......由于tempBitmap的回收,它因"尝试使用再循环位图"错误而崩溃.tempBitmap未显示,仅在此处使用.

这里出了什么问题?我应该只使用"finalBitmap"并依靠createBitmap来管理它(finalBitmap = Bitmap.createBitmap(finalBitmap,....))?我没有看到对tempBitmap的持续依赖会导致这样的失败.

编辑:是的,null赋值似乎导致适当的,最终的垃圾收集,但我很困惑,为什么临时Bitmap上的recycle()在这种情况下是如此有问题.我得到的印象是createBitmap()持有对它的引用,但为什么,以及持续多长时间?

Jus*_*ler 25

直接来自Android 文档:

从源位图的指定子集返回不可变位图.新位图可以是与源相同的对象,也可以是副本.

似乎createBitmap函数有可能重用您提供的位图.如果是这种情况,那么您不应该回收临时位图,因为您的最终位图正在使用它.你能做的一件事是

if(tempBitmap != finalBitmap) {
   tempBitmap.recycle();
}
Run Code Online (Sandbox Code Playgroud)

这应该仅在tempBitmap与finalBitmap不同时才回收.至少这似乎是文档所暗示的内容.