我正在实现一个需要大量图片的应用程序,包括缩放,使用viewPager进行分页以及所有这些内容。
使用整个图像不是一个选项,因为它会给出一个OutOfMemory异常,所以我正在实现一个自定义的平铺系统。我已经在SD卡上分割了几张图片,还有3个版本,低,中,高质量。
想法是根据缩放加载正确的图块。
理论上一切都很漂亮,而且这个系统已经在我们的iOS应用程序上运行良好,但在Android上,由于垃圾收集器,它变得无法忍受。
不知何故,似乎垃圾收集器花了太长时间来释放位图的内存,我的应用程序尝试在GC清除我要求他清除的那些之前创建新的位图,因此,如果用户分页太快,内存会增长,在某些时候所有的应用程序都会变慢,最终它会在OOM上崩溃。
每次用户转到下一页时,我都会在旧位图上调用以下内容:
lowResBitmap.recycle(); lowResBitmap = null;
有没有更好的方法来处理Android上的位图分配和释放?
编辑:我忘了在某些位图上调用.recycle(),现在它不再在OOM上崩溃了,但它非常慢(与我们的iOS应用程序相比),因为每次用户翻页时,Android调用GC很多次,它减慢了我的绘图线程。答案 0 :(得分:0)
只要变量lowResBitmap是对Bitmap实例的唯一引用,无论是否在Bitmap上调用recycle,都不应该有任何区别。
这个(循环)是一个高级调用,通常不需要调用,因为 正常的GC过程将在没有更多时释放这个内存 对此位图的引用。
您是否测试过直接致电System.gc();
以告知垃圾收集器在特定时间执行此操作?
更新(仅适用于API11 + / Android 3:
您可以通过在加载新图块时重复使用现有位图来完全阻止GC。我假设你的所有瓷砖都具有相同的尺寸,因此理想情况下这种方法。根据我的理解,可以使用inBitmap of BitmapFactory.Options。
来完成