关于解决Activity设置图片背景和ImageView设置帧动画引发的OOM的解决

近期在工作中,由于Activity的背景图片均为1280 * 720大小的,引发了一系列的OOM问题。做了一些处理,心得如下:

1.首先为什么会出现OOM呢。对于一张1280 * 720的图片,它应该占多大的内存呢?

一张图片(bitmap)占用的内存大小大概等于图片的长度 * 图片的宽度(像素)* 单位像素所占用的字节数。而单位像素所占用的字节数,官网文档如下:

-home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-165EAD24@0675EE5C.E249B254

2.那么应该如何解决该问题呢?

首先出现OOM的原因是相应的Activity使用完该背景图片后,并没有释放掉对该图片的引用,系统并不可以去回收该图片资源,因此首先想到了手动的在该 Activity销毁的时候setBackgroundResource为0(相当于remove掉该背景),但是后期发现这样做的效果并不明显,GC并没有及时的回收掉资源。又重新查资料,想到每次销毁的时候都去获取到背景的bitmap,手动的recycle一下。代码如下:

-home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-72FEBAD6@0675EE5C.E249B254

这样解决以后,OOM的问题得到了很大程度上的解决,但是同时又出现了另一个问题:

-home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-DC84B19B@0675EE5C.E249B254

那为什么出现该问题呢?
3.为什么出现trying to use a recycled bitmap 的异常
因为我们在recycle时有可能该Activity还在使用该背景图片,因此引起了该异常。那么应该如何解决呢,我的大概想法是,在recycle之前,先将Activity和背景图片的引用关系解开再去recycle图片。如下:

-home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-7C4755CD@0675EE5C.E249B254

大致可以解决掉以上问题。以上即为我解决掉这个bug的一些分享。大家如果有更好的解决办法,请告知我一声,谢啦。

对于帧动画,解决方法类似,代码如下:

QQ截图20150119172213

如有错误。请及时指出,谢谢。

原文地址:https://www.cnblogs.com/mandy920213/p/4234296.html