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来pipe理它( finalBitmap = Bitmap.createBitmap( finalBitmap ,….))? 我没有看到什么会继续依赖tempBitmap会导致这样的失败。

编辑:是的,空分配似乎导致适当的, 最终的垃圾收集,但我很神秘,为什么在这种情况下临时位图上的recycle()是如此有问题。 我得到的印象是createBitmap()持有一个引用,但为什么,以及多久?

Solutions Collecting From Web of "Android:尝试使用临时位图的“回收位图”错误"

直接从Android 文档 :

从源位图的指定子集中返回一个不可变的位图。 新的位图可能与源相同,也可能是复制的。

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

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

这应该只有当tempBitmap和finalBitmap不一样的时候才会重新使用。 至less这似乎是文件所暗示的。