从url解码图像时的OutOfMemory

时间:2012-02-14 08:26:48

标签: android

我从用户那里得到了很多这些例外:java.lang.OutOfMemoryError:位图大小超过VM预算 - 但我无法在模拟器上重现该问题。

我正在使用它作为我的ImageDownloader http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java#185,当尝试解码图像时,问题出现在第185行。

关于此错误,stackoverflow还有很多其他问题,但没有一个适合我的具体情况。这个问题的解决方案可以起作用:https://stackoverflow.com/a/823966但我似乎无法让它发挥作用。

以下是我在ImageDownloader中更改的内容:

final HttpEntity entity = response.getEntity();
if (entity != null) {
    InputStream inputStream = null;
    try {
        inputStream = entity.getContent();
        // return BitmapFactory.decodeStream(inputStream);
        // Bug on slow connections, fixed in future release.

        FlushedInputStream flushedStream = new FlushedInputStream(inputStream);

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(flushedStream, null, o);
        Log.d(LOG_TAG, "decodeStream - outWidth=" + o.outWidth + " outHeight=" + o.outHeight);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 70;

        // Find the correct scale value. It should be the power of
        // 2.
        int scale = 1;
        while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
            scale *= 2;

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(flushedStream, null, o2);
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
        entity.consumeContent();
    }
}

第二次调用decodeStream()时失败。错误是 SkImageDecoder :: Factory返回null 。我想可能inputStream在第二次调用时关闭或不可用,所以我尝试在上面的第一行使用BufferedHttpEntity,但没有运气。

有人可以引导我走向正确的方向吗?感谢。

3 个答案:

答案 0 :(得分:0)

首先检查一次下载多少图像。它消耗了多少内存在大多数Android手机中最大堆内存为16MB,当你不需要任何资源时,只需定时释放(null),就不会让堆内存增长,也不会发生内存泄漏问题。这是高内存应用程序(如使用多媒体)的常见问题之一。因此,您需要做的就是检查未使用的资源,并且将来也不会使用它们并使它们为空(例如位图),因此它将释放内存。

答案 1 :(得分:0)

使用BitmapFactory.Options应该做的事情。如果你要忘记内存,请尝试通过删除变量来清除内存。

你在//解码图像大小或//使用inSampleSize解码

时,你在哪里获得“SkImageDecoder :: Factory返回null”

答案 2 :(得分:0)

首先下载图像并放入一个字节数组。在使用输入流一段时间后,decodeStream会返回null