将大量图像加载到内存会导致内存不足异常 - Android

时间:2012-02-27 09:40:48

标签: android bitmap out-of-memory

我有点绊倒了:

案例1 :我试图制作一个包含26张图片的动画(每张图片的大小约为200KB)。总计为5.3 MB。动画效果很好。图像被加载到内存中,一切正常。

案例2 :现在,当我尝试制作一个包含129张图像(每张约30KB,总共4,6 MB)的动画时,我出现了内存异常。

我正在跟踪内存分配,在“案例1 ”中,加载后每位图的加载位图图像大小为691200字节。在“ case 2 ”中,每个文件的位图大小约为563520字节。

使用getRowBytes() * getHeight()进行计算

这很奇怪,“案例2 ”中的图像尺寸大约小6倍,但加载后尺寸大致相同。

这就是我将位图加载到内存的方式:

       for (int i = 0; i <= 128; i++) {
            imagesHolder[i] = BitmapFactory.decodeResource(
                    getApplicationContext().getResources(),
                    getApplicationContext().getResources().getIdentifier(
                            "image" + (i + 1) + "", "drawable",
                            getApplicationContext().getPackageName()));
            System.out.println(imagesHolder[i].getRowBytes() * imagesHolder[i].getHeight());
            totalSize+=imagesHolder[i].getRowBytes() * imagesHolder[i].getHeight();
            System.out.println("TOTAL: "+totalSize);
        }

那么,为什么我的小图像在加载到内存后变得如此之大?所有提示都表示赞赏。 :)

2 个答案:

答案 0 :(得分:0)

这不是确定存储位图所需内存量的精确方法。每个Bitmap对象都包含一些额外的字段,这些字段也需要内存。 看看这个问题:Android & Dalvik - Get the size of an object

答案 1 :(得分:0)

我们可以开发一个高达50MB内存的应用程序大小(.apk)。垃圾收集器也有可能无法重新收集内存。所以你必须最终回收位图;虽然处理没有位图我们也要考虑内存问题.... 如果(!bmp.isRecycled()){         bmp.recycle();}