位图图像内存不足

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

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

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

然后我把它放到一个ImageView来显示它。 这工作,并显示我的形象,以其完整的质量。 然而,如果我点击回来,然后单击以再次看到该图像(并重复这6次)..第六次打开图像(activity2)我得到一个内存不足的错误,说堆大小= 6919KB,分配= 3125KB,位图大小= 25848KB!

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

谁能解释为什么? 谢谢

有一些来自android的很好的信息,详细解释它,以及如何克服这个问题。

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

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

位图占用大量内存,特别是对于照片等丰富的图像。 例如,Galaxy Nexus上的相机可以拍摄高达2592×1936像素(500万像素)的照片。 如果使用的位图configuration是ARGB_8888(默认从Android 2.3开始),那么将这个图像加载到内存中需要大约19MB的内存(2592 * 1936 * 4字节),立即耗尽了某些设备上的每个应用程序的限制。

我再次指出你从这个伟大的链接,我发现从另一个SO问题,有教程如何妥善解决问题。

inSample大小应该设置,以便图像缩放到显示区域的大小(1 =全尺寸),除非有某些原因你认为你需要图像的所有位,所以2将= 1/2比例4 1 / 4比例等

在使用= null之前,也可以尝试使用bm.recycle()

更新

看看第二个答案,除非你已经试过了,否则回收是做不到的 。 我已经做了类似的事情加载图像,永远不会用完内存,这并不是certificate它会为你工作,但这是一个最好的做法,据我所知。