安卓:临时位图"trying to use a recycled bitmap"错误



我的应用程序可以加载相当大的图像。为了节省内存,我试图使用一个临时位图来加载,另一个用于转换后的最终图像:

.....
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的持续依赖会导致这样的失败。

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

直接来自Android文档:

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

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

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

应该只在tempBitmap与finalBitmap不相同时才循环使用。至少这似乎是文档所暗示的。

最新更新