使用重新缩放的位图泄漏内存

时间:2014-09-22 11:50:32

标签: android bitmap out-of-memory scale

我想缩放图片以保持相同的比例。因此,例如,在重新缩放之后,箭头在所有图像中具有相同的尺寸。所以我跟着this example,它运行正常。 但是在失去对listview的操作后,我可能会出现OutOfMemoryError错误。我在DDMS中查看堆转储,这是正确的,分配大小总是上升。我添加了一些bitmap.recycle(),但会导致错误:"cannot draw recycled bitmaps"

我也试过the official tutorial,但我遇到了问题,下载的示例与解释的不一样,而且我并不了解所有内容。

拜托,你能解释一下如何解决我的错误吗? 感谢

1 个答案:

答案 0 :(得分:0)

Bitmaps始终存储在设备堆内存中,而您的设备堆内存无法承载Bitmaps这个数量您尝试的方式与图像的相同分辨率相同,如此,首先尝试grow the heap使用您的应用清单,然后尝试这种方式来调整Bitmaps:< / p>

public static Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight) {

        if(bitmapToScale == null)
            return null;
        //get the original width and height
        int width = bitmapToScale.getWidth();
        int height = bitmapToScale.getHeight();
        // create a matrix for the manipulation
        Matrix matrix = new Matrix();

        // resize the bit map
        matrix.postScale(newWidth / width, newHeight / height);

        // recreate the new Bitmap and set it back
        return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);  

    }

如果这也不起作用,那么,您必须执行以下操作之一:

  1. 为每张图片分配更少的宽度和高度。
  2. 使用ImageLoader等内容压缩图像。
  3. 使用具有堆空间的其他设备。
  4. 限制使用的图像数量。
  5. 提示:回收Bitmap会将其从堆内存中完全删除,因此,出现"cannot draw recycled bitmaps"错误是合乎逻辑的,因此,如果您想要recycle它,然后在您的应用中使用它,您必须首先将其存储在ArrayList<Bitmaps>

    之类的内容中