2011-07-13 95 views
9

我知道有很多关于Android的位图图像讨论出来的内存,但是我想知道,如果有人可以解释给我..位图图像的内存不足

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

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

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

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

任何人都可以解释为什么?谢谢

+0

这是一个带alpha通道的大约6百万像素的位图。位图很大。 –

+0

为什么位图大小在25mb上出现内存不足错误呢?正如我所说,它将工作5视图和第六次内存不足 –

+0

你是否在泄漏内存? –

回答

2

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

也可以尝试bm.recycle()当你使用之前,位图完成= NULL

更新

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

+0

据我所知bm.recycle();什么都不做。我了解比例尺,是的,我需要我的形象是全面的。我甚至创建了onDestory方法并调用了垃圾收集器,名为finish();并将我的视图实例和变量设置为null..etc,它仍然崩溃 –

+0

因此,您的图像h/w是<=显示大小,或者你说你需要操纵位?至于.recylce什么都不做,这不是文档所说的 - void recycle() 释放与此位图关联的本机对象,并清除对像素数据的引用。那么你是否真的尝试了.recyle()呢? – Idistic

+0

@dronyx看到我以上评论和修改回答 – Idistic

16

从android中可以得到一些很好的信息,详细解释它,以及如何解决这个问题here

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

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

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

我再次指出你的这个great link我从另一个SO中发现了一个问题,它有关于如何正确地解决问题的教程。

+0

如何使用毕加索或通用图像加载程序来处理此问题?我正在使用这些库,并且仍然很快得到OOM。 –

+0

@SagarPanwala [这可能是有用的](http://stackoverflow.com/questions/30011106/download-image-and-resize-to-avoid-oom-errors-picasso-fit-distorts-image)。还要考虑到你在其他地方使用了太多的内存。 [它可能不是毕加索本身](https://github.com/square/picasso/issues/1153) – Doomsknight

+0

但我在主屏幕上有这个要求,我只是运行应用程序并滚动它,它崩溃。 我有ViewPager与5图像(宽度和高度=屏幕宽度)作为ListView项目。 –