加载图像会抛出OutOfMemoryException

时间:2011-02-10 20:33:03

标签: android image bitmap listactivity

我使用以下代码将图像加载到ListActivity中的行。

URL url = new URL(drink.getImageUri());
                InputStream fis = url.openStream();
                //Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(fis, null, o);
                int scale = 1;
                if (o.outHeight > imageMaxSize || o.outWidth > imageMaxSize) {
                    scale = (int) Math.pow(2, (int) Math.round(Math.log((imageMaxSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))));
                }
                fis.close();
                fis = url.openStream();
                //Decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                bitmap = BitmapFactory.decodeStream(fis, null, o2);

                fis.close();

imageMaxSize是screenHeight / 7所以每张图片应该相当小。

我在上面的代码中做错了吗?我得到的所有错误都在第二行,我尝试实际加载位图。

提前致谢 罗兰

3 个答案:

答案 0 :(得分:0)

我认为这里的关键是你在列表行上这样做。当你完成它们以清理内存时,你需要回收你的位图。这可能不会在您的代码的第一次迭代中发生,但由于您没有使用Bitmap.recycle()回收内存,最终会耗尽内存并获得“Bitmap超出VM预算”

答案 1 :(得分:0)

接受答案的更好答案。

基本上有时因为舍入Math.round(等)会使比例回到1。

1表示即使图像太大也没有缩放。

我在alogirthm之后做了一个简单的检查。

    if (o.outHeight > imageMaxSize || o.outWidth > imageMaxSize) {
        scale = (int) Math.pow(2, (int) Math.round(Math.log((imageMaxSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))));
        // We already checked it was larger than acceptable so we know we at
        // least need to scale down one step
        if (scale == 1) {
            scale = 2;
        }

    }

答案 2 :(得分:-2)

上面代码的问题包括以下块:

if (o.outHeight > imageMaxSize || o.outWidth > imageMaxSize) {
                    scale = (int) Math.pow(2, (int) Math.round(Math.log((imageMaxSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))));
                }

它根本不起作用。 WillyTates关于尝试增加缩放比例的评论使我检查了计算结果并且它总是返回1.

现在,当我修复它以便得到4或8的比例时,它的工作效果要好得多,而且我无法得到错误。

由于 罗兰