回收位图会影响内存中的其他副本吗?

时间:2015-03-29 06:13:09

标签: java android bitmap resize recycle

我正在调整位图数组的大小。虽然当我调整(缩小)存储在数组中的位图时,数组加载正常(表示有足够的​​内存来容纳它),但是遇到OutOfMemory错误。这是导致堆耗尽的代码:

for (int i=0;i<2;i++) {
    for (int j=0;j<427;j++) {
      frameSet[i][j] = Bitmap.createScaledBitmap(frameSet[i][j],128,128,true);
    }
}

为了解决这个问题,我创建了一个临时位图,并添加了一个recycle()调用:

for (int i=0;i<2;i++) {
    for (int j=0;j<427;j++) {
        tempFrameResize = Bitmap.createScaledBitmap(frameSet[i][j],128,128,true);
        frameSet[i][j] = tempFrameResize;
        tempFrameResize.recycle();
    }
}

这会纠正OutOfMemory错误,但frameSet的内容不再正确(即它们看起来都是白色的,就好像位图的内容被清除一样)。我的回收调用(在tempFrameResize的内容被传递到frameSet之后调用)是否会影响frameSet的内容?这似乎正是发生的事情。

1 个答案:

答案 0 :(得分:0)

将缩放后的位图指定给数组时,您不会复制该对象。你正在引用它。它就像任何其他对象实例一样。因此,您将循环使用缩放的位图本身和分配给该阵列的位图。这是同一个对象。 您没有遇到堆错误,因为您正在发布位图数组图像。