前段时间做了一个UI,用了大量的图片,使用了网上说几个方法,但是还是在个别情况出现oom。下面是一个解决方法。
使用的方法有:
1.不用的图片马上给释放
bmp.recycle()
2.使用数据流方式加载图片
BitmapFactory.decodeStream
3.使用LruCache缓存
4.加载图片的时候使用
options.inJustDecodeBounds = true; 先计算大小,然后
options.inSampleSize = 10;// 固定缩小10倍
随后使用的时候放大,(我的这个UI失真不会影响结果,是用于计算的)
使用的以上的方法,仍然会在极端的情况下出现oom;
用哲学的思想解释是,已经有解决方法,我是没注意到或者没找到。
后来经过测试发现问题在于,图片加载完成后使用recycle释放,此时VM并没有马上清理资源,所以在后面使用的时候就增加oom的风险,所以解决办法也比较简单
就是在释放后执行
bmp.recycle()
System.gc(); // 这是关键,提示系统回收垃圾
就这么简单的一行代码就解决了问题。
参考http://www.cnblogs.com/manuosex/p/3661762.html等文章