当显示包含大量位图(全屏,wvga)的图库时,我经常会遇到内存问题。我认为这与位图没有被回收有关。何时/如何强制重建位图?
我还注意到在simpleCursorAdapter的getView方法中,convertView始终为null。我认为这意味着旧视图不会被回收?即使在来回滚动时,每次都会创建一个新视图。但是,来回滚动不会导致内存不足问题,只有在图像总数足够大时才会发生。
当使用与ListView相同的适配器时,视图会被回收,所以看起来问题出在Gallery上。
我可以做些什么来强制回收视图和/或位图?在不降低图库大小和位图质量的情况下,我还可以做些什么来管理内存。
答案 0 :(得分:0)
如果您确定tou将不再使用位图,则可以使用recycle()
,例如在具有临时位图的任何操作中。但是......你可以使用BitmapFactory.Options,例如:
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inPurgeable=true;
Bitmap bitmapTemp = BitmapFactory.decodeResource(getResources(), R.drawable.intro, bitmapOptions);
它做什么? inPurgeable选项将假设一旦系统需要内存并且你的位图不再有用,系统将自行回收这个内存分配。如果由于某种原因您无法使用BitmapFactory加载图像,那么您可以使用Recycle()并建议使用system.gc()调用de garbage collector,如果您正在开发游戏,这是有用的,因为当垃圾收集器它在系统内存不足时被激活,它将消耗一些有价值的毫秒。 您应该非常小心使用位图,它们不会存储在应用程序使用的“普通”内存中,而是存储在所有应用程序使用的“常规”内存中,除非您使用的是Android 3.0。 如果你遇到内存泄漏而无法找到它看堆...你应该看看你的代码加载和使用位图。 希望它有所帮助。
答案 1 :(得分:-2)
您永远不会需要来回复Bitmap
。但是,可以执行此操作,当您遇到OutOfMemory
错误时,它会有所帮助。但是不要再使用位图了,因为(来自javadoc)
如果是,它将抛出异常
getPixels()
或setPixels()
是。{ 叫,什么也不会画。这个 操作无法逆转,所以它 只有在你确定的时候才应该打电话 没有进一步的用途 位图。
在你的情况下,我认为你应该:
BitmapFactory.Options.inSampleSize
或MediaStore.Images.Thumbnails