什么时候安全/可以使用Gallery视图在Android SimpleCursorAdapter中回收位图?

时间:2010-12-15 13:36:13

标签: android gallery out-of-memory

当显示包含大量位图(全屏,wvga)的图库时,我经常会遇到内存问题。我认为这与位图没有被回收有关。何时/如何强制重建位图?

我还注意到在simpleCursorAdapter的getView方法中,convertView始终为null。我认为这意味着旧视图不会被回收?即使在来回滚动时,每次都会创建一个新视图。但是,来回滚动不会导致内存不足问题,只有在图像总数足够大时才会发生。

当使用与ListView相同的适配器时,视图会被回收,所以看起来问题出在Gallery上。

我可以做些什么来强制回收视图和/或位图?在不降低图库大小和位图质量的情况下,我还可以做些什么来管理内存。

2 个答案:

答案 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()是。{   叫,什么也不会画。这个   操作无法逆转,所以它   只有在你确定的时候才应该打电话   没有进一步的用途   位图。

在你的情况下,我认为你应该: