Android上的图片拼贴,垃圾收集器减速

时间:2011-10-27 12:47:37

标签: android garbage-collection

我正在实现一个需要大量图片的应用程序,包括缩放,使用viewPager进行分页以及所有这些内容。

使用整个图像不是一个选项,因为它会给出一个OutOfMemory异常,所以我正在实现一个自定义的平铺系统。我已经在SD卡上分割了几张图片,还有3个版本,低,中,高质量。

想法是根据缩放加载正确的图块。

理论上一切都很漂亮,而且这个系统已经在我们的iOS应用程序上运行良好,但在Android上,由于垃圾收集器,它变得无法忍受。

不知何故,似乎垃圾收集器花了太长时间来释放位图的内存,我的应用程序尝试在GC清除我要求他清除的那些之前创建新的位图,因此,如果用户分页太快,内存会增长,在某些时候所有的应用程序都会变慢,最终它会在OOM上崩溃。

每次用户转到下一页时,我都会在旧位图上调用以下内容:

lowResBitmap.recycle(); lowResBitmap = null;

有没有更好的方法来处理Android上的位图分配和释放?

编辑:我忘了在某些位图上调用.recycle(),现在它不再在OOM上崩溃了,但它非常慢(与我们的iOS应用程序相比),因为每次用户翻页时,Android调用GC很多次,它减慢了我的绘图线程。

1 个答案:

答案 0 :(得分:0)

只要变量lowResBitmap是对Bitmap实例的唯一引用,无论是否在Bitmap上调用recycle,都不应该有任何区别。

来自Android SDK documentation

  

这个(循环)是一个高级调用,通常不需要调用,因为   正常的GC过程将在没有更多时释放这个内存   对此位图的引用。

您是否测试过直接致电System.gc();以告知垃圾收集器在特定时间执行此操作?

更新(仅适用于API11 + / Android 3:

您可以通过在加载新图块时重复使用现有位图来完全阻止GC。我假设你的所有瓷砖都具有相同的尺寸,因此理想情况下这种方法。根据我的理解,可以使用inBitmap of BitmapFactory.Options

来完成