2010-12-15 42 views
0

当显示一个包含大量位图(全屏,wvga)的图库时,我经常遇到内存不足的问题。我认为这与位图不被回收有关。何时/如何强制位图被回收?何时安全/可以在Android SimpleCursorAdapter中使用Gallery视图回收位图?

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

与ListView一起使用同一个适配器时,视图被回收,所以看起来问题在于Gallery。

我能做些什么来强制视图和/或位图被回收?我还能做什么来管理内存,而不会降低图库大小和位图质量。

+0

您是否尝试过像'purgeable'这样的各种位图选项 - 您是否在图库中使用了预缩放或高质量图像?你见过'SoftReference' /'WeakReference'用于内存管理吗? – 2010-12-15 13:56:06

回答

-2

您从不需要需要来回收Bitmap。但是,你可以做到这一点,它会帮助你有OutOfMemory错误。但不要它,直到不需要位图的比较多,因为(Javadoc中)

它会抛出一个异常,如果 getPixels()setPixels()是 调用,将借鉴什么。这个 操作不能被颠倒过来,所以它只能在你确定 位图没有进一步用途的情况下调用 。

在你的情况,我想你应该:这是位图BitmapFactory.Options.inSampleSizeMediaStore.Images.Thumbnails打开

  • 使用大拇指
  • 在内存中最多只有一个全尺寸的位图(也许有你预装可以承受)
+1

对,你不需要*,但是如果你不这样做,你的应用程序会崩溃。你究竟如何定义“需要”? – 2011-04-22 21:54:51

+0

谷歌对“需求”的定义不同。您必须在HC之前回收位图。 – Raz 2012-03-14 13:50:26

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,否则它将存储在所有应用程序使用的“常规”内存中。 如果您发现内存泄漏,并且无法在堆中找到它,那么您应该查看代码加载和位图。 希望它有帮助。

相关问题