位图图像内存不足

时间:2011-07-13 16:05:26

标签: android image memory view bitmap

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

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

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
bm = BitmapFactory.decodeFile(myImagePath, options);

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

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

任何人都可以解释原因吗?感谢

2 个答案:

答案 0 :(得分:16)

Android提供了一些很好的信息,详细解释了这一点,以及如何解决这个问题here

每个像素为4个字节。 6M像素= 24MBs

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

  

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

我再次向你指出这个great link我从另一个SO问题中发现,该问题包含如何正确解决问题的教程。

答案 1 :(得分:2)

inSample尺寸应设置为使图像缩放到显示区域的大小(1 =全尺寸),除非您认为需要图像的所有位,因此2将= 1/2比例4 1/4比例等。

在使用= null

之前完成位图时,也请尝试使用bm.recycle()

<强>更新

看看第二个答案what does recycle do,除非你已经尝试过,但它没有用。我已经完成了与加载图像类似的事情并且永远不会耗尽内存,这并不能证明它对您有用,但据我所知,这是最好的做法。