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