调整后我应该回收我的位图吗?

时间:2014-02-10 13:39:25

标签: android

我有一个实用程序方法(下面)调整位图大小并给我一个新版本。因为我正在使用相当多的图像&我想减少内存不足的可能性,我在使用后已经回收了位图。

这几乎适用于所有设备。但是,我已经注意到三星Galaxy tab 3(10英寸)和注释10.1(2014)我得到了下面的堆栈痕迹:

java.lang.IllegalArgumentException: Cannot draw recycled bitmaps
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:756)
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:104) 

以下是我的调整代码:

private static Bitmap resizeBitmap(int newWidth, int newHeight, Bitmap bitmapResize) {
    if (bitmapResize == null) {
        return null;
    }

    int width = bitmapResize.getWidth();
    int height = bitmapResize.getHeight();

    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;

    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);

    Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmapResize,
            newWidth, newHeight, true);

    //SHOULD I DO THIS???
    bitmapResize.recycle();
    return resizedBitmap;
}

我还没弄清楚为什么几乎所有设备都可以工作,除了那些2(可能还有更多)。模拟器也没有显示任何问题。

值得注意的是,并非所有图片都能给我一个"无法绘制回收的位图"错误。只有一些。但它始终如一的图像。

(如果使用它,我的应用程序在2.2以上运行)

3 个答案:

答案 0 :(得分:2)

我设法找到解决问题的方法。事实证明,如果调整大小的宽度/高度与原始图像匹配,原始图像可以作为优化传回。

我想在某些设备上,我的计算导致我尝试将图像调整为现有大小。当我回收'#34; old"位图,我也重新调整了调整大小的位置。

解决方案是将我的代码更改为

if (bitmapResize!=resizedBitmap )
    bitmapResize.recycle();

我发现此问题涉及我的问题(我在初次搜索问题时没有找到)

https://groups.google.com/forum/#!topic/android-developers/M6njPbo3U0c

答案 1 :(得分:0)

我在ma游戏中遇到了类似的问题,根据我的经验,你做的是正确的事情。它是回收旧位图的正确位置,并且会阻止OutOfMemoryExceptions,请记住,这个Bitmap实例将不再可用。

答案 2 :(得分:0)

您可以简单地使用输入位图参考作为输出。这样您的输入位图将被覆盖,您无需回收它。

种类:

private static Bitmap resizeBitmap(int newWidth, int newHeight, Bitmap bitmapResize) {
if (bitmapResize == null) {
    return null;
}

int width = bitmapResize.getWidth();
int height = bitmapResize.getHeight();

float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;

Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);

return Bitmap.createScaledBitmap(bitmapResize,
        newWidth, newHeight, true);

}