1

我正在尝试在我的应用程序中加载大小为 495KB 的图像。如果我加载此图像,堆大小会从 25MB 增加到 35MB,这会导致我的应用程序出现实际内存问题。如果我不加载此图像,则堆大小将保持在 25MB。谁能告诉它为什么占用这么多堆大小?

图片如下 在此处输入图像描述

我用来加载图像的代码是

    InputStream s4 = getResources().openRawResource(R.drawable.parallax_layer4);    
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
    System.gc();
    if(bitmap4 != null) {
        bitmap4.recycle();
    }
    s3 = null;
    System.gc();     

    bitmap4 = bitmap(s4);
    layer4Back = new ImageView(this);
    layer4Back.setImageBitmap(bitmap4);
    layer4Back.setScaleType(ScaleType.FIT_XY);
    parallaxLayout.addView(layer4Back, 3, lp);
    try {
        s4.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }
    s4 = null;
    System.gc();

private static Bitmap bitmap(final InputStream is) {
    Bitmap bitmap = null;
    System.gc();
    Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    options.inSampleSize = 1; 

    try {
       // bitmap = BitmapFactory.decodeStream(is);
       bitmap = BitmapFactory.decodeStream(is, null, options);

    } catch (Error e) {
       // TODO: handle exception
       e.printStackTrace();
    }
    return bitmap;
}

谢谢阿亚兹阿拉维

4

4 回答 4

5

图像文件在加载到内存时是未压缩的。在 5600 x 480 像素和每像素 32 位的情况下,您的图像在未压缩时几乎正好是 10 MB。

我的建议是把它切成更小的部分,只加载你需要的部分。

于 2012-07-06T07:18:15.377 回答
2

5,600px * 480px * 4 字节 = 10,752,000 字节,所以这并不奇怪。

在有效地显示位图文章中有一些很好的指导,还有很多关于 SO 讨论好的解决方案的问题。

于 2012-07-06T07:19:15.607 回答
1

那么你期待什么?图像是 5600 x 480 像素,现在在内存中每个像素都占用 32 位(请纠正我的人)。做数学,你就会明白为什么这是一个问题。您需要使用较小的图像或将图像分割成部分并在需要时加载需要的部分并丢弃不必要的部分。

我有一个类似的问题,在这里讨论:Android app crash out of memory on relaunch

关于这个主题和可能的解决方案也有很长的讨论:Strange out of memory issue while loading an image to a Bitmap object

于 2012-07-06T07:19:09.213 回答
0

如果您加载位图并具有高 DPI 屏幕分辨率,BitmapFactory 将自动缩放您的位图。我认为在具有最大 DPI 值的设备上,它会在两个方向上缩放 2 倍。

这或许可以解释一些意外的增长。尝试将您的图像放在名为的文件夹中drawable-nodpi,它们将不会被缩放。

于 2012-07-06T07:16:49.723 回答