在Android SimpleCrsorAdapter和Gallery view中,何时可以安全地/可能地回收位图?

在Android SimpleCrsorAdapter和Gallery view中,何时可以安全地/可能地回收位图?,android,gallery,out-of-memory,Android,Gallery,Out Of Memory,当显示包含大量大型位图(全屏、wvga)的图库时,我经常会出现内存不足的问题。我认为这与位图没有被回收有关。何时/如何强制回收位图 我还注意到,在simpleCursorAdapter的getView方法中,convertView始终为null。我想这意味着旧的观点是不可回收的?即使在来回滚动时,每次都会创建一个新视图。但是,来回滚动不会导致内存不足问题,只有当图像总数足够大时才会发生这种情况 将同一适配器与ListView一起使用时,视图会被回收,因此问题似乎出在Gallery上 如何强制回收

当显示包含大量大型位图(全屏、wvga)的图库时,我经常会出现内存不足的问题。我认为这与位图没有被回收有关。何时/如何强制回收位图

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

将同一适配器与ListView一起使用时,视图会被回收,因此问题似乎出在Gallery上

如何强制回收视图和/或位图?在不减少库大小和位图质量的情况下,我还能做些什么来管理内存。

您永远不需要重新设置
位图的样式。但是,您可以这样做,并且当您出现
OutOfMemory
错误时,它会有所帮助。但是在不再需要位图之前不要使用它,因为(来自javadoc)

如果
getPixels()
setPixels()
是 他打电话来了,什么也不画。这 操作无法反转,因此无法执行 只有在您确定的情况下才应该打电话 该软件没有其他用途 位图

就你而言,我认为你应该:

  • 使用使用或打开位图的拇指
  • 内存中最多只能有一个完整大小的位图(可能有一个预加载在您可以承受的范围内)
如果您确定不再使用位图,例如在任何带有临时位图的操作中,您可以使用
recycle()
。但是…您可以使用BitmapFactory。选项,例如:

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inPurgeable=true;

Bitmap bitmapTemp = BitmapFactory.decodeResource(getResources(), R.drawable.intro, bitmapOptions);
它是干什么的?InPurgable选项将告诉我们,一旦系统需要内存,并且位图不再有用,系统将自行回收此内存分配。如果由于某种原因无法使用BitmapFactory加载图像,则可以使用Recycle(),建议先使用system.gc()调用反垃圾收集器,然后再使用system.gc(),如果您正在开发例如游戏,这是非常有用的,因为当您在系统内存不足时,垃圾收集器被激活,它将消耗一些有效的毫秒。 你应该非常小心使用位图,它们不会存储在应用程序使用的“普通”内存中,而是存储在所有应用程序使用的“通用”内存中,除非你使用的是Android 3.0。 如果出现内存泄漏,但在堆中找不到它。。。您应该看看您的代码加载和使用位图。
希望对您有所帮助。

您是否尝试过各种位图选项,如
purgeable
-您是否在图库中使用预缩放或高质量图像?您看过用于内存管理的
SoftReference
/
WeakReference
吗?是的,您不需要,但如果不看,您的应用程序将崩溃。你是如何定义“需要”的?谷歌对“需要”的定义是不同的。您必须在pre HC中回收位图。