位图图像内存不足

Mr *_*r X 9 memory android image view bitmap

我知道有很多关于android位图图像内存的讨论,但我想知道是否有人可以向我解释..

目前在我的应用程序中,我有一个列出图像缩略图(低质量)的活动,当我单击图像时,它会打开一个新活动以全屏查看图像.在我的第二个活动课中,我有:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
bm = BitmapFactory.decodeFile(myImagePath, options);
Run Code Online (Sandbox Code Playgroud)

然后我把它放到ImageView中显示它.这可以使我的图像显示其全部质量.但是,如果我再次单击然后再单击以查看该图像(并重复此次6次)..第6次打开图像(activity2)时出现内存不足错误,说堆大小= 6919KB,分配= 3125KB,位图大小= 25848KB!

位图大小如何大?我假设它可能一直在创建新的实例,所以我决定在我的第二个活动中放一个方法来按下后退键.在这个方法中我设置了我的bitmap = null并且也做了System.gc()清除垃圾收集器,但这没有解决问题.在第6次点击缩略图以全分辨率查看图像时,我仍然会出现内存不足错误

有谁能解释为什么?谢谢

Doo*_*ght 16

有来自Android的解释这一切详细,以及如何克服这个问题,一些伟大的信息在这里.

每个像素是4个字节.6M像素= 24MB

一张照片可以耗尽所有内存.

位图占用了大量内存,特别是对于像照片这样的丰富图像.例如,Galaxy Nexus上的相机拍摄的照片最高可达2592x1936像素(5百万像素).如果使用的位图配置是ARGB_8888(默认情况下从Android 2.3开始),则将此图像加载到内存中需要大约19MB的内存(2592*1936*4字节),这会立即耗尽某些设备上的每个应用程序限制.

我再次向您指出我从另一个SO问题中找到的这个很棒的链接,该问题包含如何正确解决问题的教程.


Idi*_*tic 2

应设置 inSample 大小,以便将图像缩放到显示区域的大小(1 = 全尺寸),除非出于某种原因您认为需要图像的所有位,因此 2 = 1/2 scale 4 1 /4 规模等

当您完成位图后,在使用 =null 之前也可以尝试 bm.recycle()

更新

看看第二个答案,回收是做什么的,除非您已经尝试过但它不起作用。我在加载图像方面做过类似的事情,并且从未耗尽内存,这并不能证明它适合您,但据我所知,这是最佳实践。

  • 回收确实释放了位图使用的内存,并且非常重要。 (3认同)
  • 我现在已经修复了OOM异常。基本上,Android 在销毁 Activity 时不会进行垃圾收集。因此,当您重新启动该活动时,在这种情况下,我正在加载位图图像......内存堆将很快变大并最终耗尽内存。为了解决这个问题,我在 onDestory 方法中添加了以下内容:bm.recycle; customImageView.setImageDrawable(null); 系统.gc(); (3认同)