2011-11-02 107 views
20

我的应用程序可以加载相当大的图像。在努力为内存保守,我试图用一个临时的位图加载,另一个用于改造后的最终图像:现在Android:“尝试使用回收位图”错误与临时位图

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

,在这一点上我们与tempBitmap,这是做只需要将解码的位图传输到createBitmap中的转换步骤即可。所以:

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

而且...它试图使用一个回收的位图错误,具体是因为tempBitmap的回收。 tempBitmap没有显示,仅在处使用

这里怎么回事?我应该用 “finalBitmap” 贯穿并依靠createBitmap对其进行管理(finalBitmap = Bitmap.createBitmap(finalBitmap,....))?我无法看到将会导致这样的失败的tempBitmap的持续依赖。

编辑:是的,空的分配似乎得到适当的,最终垃圾收集,但我很迷惑,为什么再循环()上的临时位图是在这种情况下,这样的问题。我得到的印象是createBitmap()持有对它的引用,但为什么以及多久?

回答

25

直从Android documentation

返回从源 位图的指定子集的不可变位图。新的位图可能与源相同,或者可能有复制品 。

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

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

这应该只是回收tempBitmap,当它不是finalBitmap相同。至少这似乎是文档所暗示的。

+1

我错过了它可能是同一个对象的一点。我将temp设置为null不会导致副作用,因为它不会真正释放对象,而recycle()直接影响它。嗯。我接受你的答案,并希望你能帮我加强我的问题(因为我认为这对于人们来说是有用的信息)。 – MartyMacGyver