我正在尝试在我的应用程序中加载一个大小为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;
}谢谢Ayaz Alavi
发布于 2012-07-06 15:18:15
图像文件在加载到内存中时是解压缩的。在5600 x 480像素和每像素32位的情况下,您的图像在未压缩时几乎正好是10MB。
我的建议是把它切成更小的部分,只加载你需要的部分。
发布于 2012-07-06 15:19:16
5,600px * 480px *4字节= 10,752,000字节,所以这并不奇怪。
在Displaying Bitmaps Efficiently article中有一些很好的指导,以及相当多的问题,所以在这里讨论好的解决方案。
发布于 2012-07-06 15:19:09
那你想要什么呢?图像是5600x480px,现在在内存中,每个像素的都需要32位(请给我纠正一下)。计算一下,你就会明白为什么它是一个问题。您需要使用较小的图像或将图像分割成多个部分,并在需要时加载所需的部分,然后丢弃不必要的部分。
我遇到了类似的问题,这里讨论了这个问题:Android app crash out of memory on relaunch
这里也有关于这个主题和可能的解决方案的很长的讨论:Strange out of memory issue while loading an image to a Bitmap object
https://stackoverflow.com/questions/11357483
复制相似问题