近期在工作中,由于Activity的背景图片均为1280 * 720大小的,引发了一系列的OOM问题。做了一些处理,心得如下:
1.首先为什么会出现OOM呢。对于一张1280 * 720的图片,它应该占多大的内存呢?
一张图片(bitmap)占用的内存大小大概等于图片的长度 * 图片的宽度(像素)* 单位像素所占用的字节数。而单位像素所占用的字节数,官网文档如下:
2.那么应该如何解决该问题呢?
首先出现OOM的原因是相应的Activity使用完该背景图片后,并没有释放掉对该图片的引用,系统并不可以去回收该图片资源,因此首先想到了手动的在该 Activity销毁的时候setBackgroundResource为0(相当于remove掉该背景),但是后期发现这样做的效果并不明显,GC并没有及时的回收掉资源。又重新查资料,想到每次销毁的时候都去获取到背景的bitmap,手动的recycle一下。代码如下:
这样解决以后,OOM的问题得到了很大程度上的解决,但是同时又出现了另一个问题:
那为什么出现该问题呢?
3.为什么出现trying to use a recycled bitmap 的异常
因为我们在recycle时有可能该Activity还在使用该背景图片,因此引起了该异常。那么应该如何解决呢,我的大概想法是,在recycle之前,先将Activity和背景图片的引用关系解开再去recycle图片。如下:
大致可以解决掉以上问题。以上即为我解决掉这个bug的一些分享。大家如果有更好的解决办法,请告知我一声,谢啦。
对于帧动画,解决方法类似,代码如下:
如有错误。请及时指出,谢谢。