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

时间:2011-11-02 15:53:17

标签: android memory-management bitmap recycle

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

.....
finalBitmap.recycle();
finalBitmap = null;
Bitmap tempBitmap  = BitmapFactory.decodeStream(fin, ...);
finalBitmap = Bitmap.createBitmap(tempBitmap, ....);
imgview.setImageBitmap(finalBitmap);
.....

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

.....
tempBitmap.recycle();
tempBitmap = null;
.....

并且......由于tempBitmap的重复使用,它因“尝试使用循环位图”错误而崩溃。 tempBitmap未显示,仅在那里使用

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

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

1 个答案:

答案 0 :(得分:25)

直接来自Android documentation

  

从源的指定子集返回不可变位图   位图。新位图可以是与源相同的对象,也可以是副本   已经完成了。

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

if(tempBitmap != finalBitmap) {
   tempBitmap.recycle();
}

只有当它与finalBitmap不同时才应该回收tempBitmap。至少这似乎是文档所暗示的内容。