android的OOM问题的归纳与解决

   

     做了好几年的android开发了,因为应用中总免不了图片的使用和各种数据的加载,所以程序会出现oom也是可想而知的,那如何避免呢。

     概括的讲有6点:

     1:老的换新的。

     使用android提供的新技术来代替以前过时的,或者不提倡使用的。例如使用新控件来代替一些老控件,例如用RecylerView代替ListView,还有Google出的网络请求的一些新技术。这个就需要大家多了解android新的一些变动;或者自己可以根据项目的需求来写一些控件或者使用第三方控件,以便统一控制内存回收,效率提高,例如好几个项目都用到了很多子项滑动并且变大的显示,就需要咱们统一做个控件来实现了。还有大家都常用的imageloader也是个很好的控件例子,当然imageloader也有缓存机制,这个就是后话了。

     2:图片入缓存。

     这个大家都比较常用,例如软引用和弱引用(不过这个好像不太推荐喽),或者android后面出的LruCache类等,或者就是自己根据hashmap写一些东东来缓存图片。

     3:图片放本地。

     由于缓存还是在内存中,所以不宜过多,那么如果图片过多怎么办,就需要存储到本地了,但是存多少张或者存多大这个就需要开发者仔细斟酌了。

     4:大图变小图。

     有一些图本身就很大,尤其是一些背景图,如果你要加载它们的话,很有可能就会oom,所以可以考虑是否可以把图片变小或者压缩,或者分辨率变差些,如果可以接受的话,也是可以有效减小程序oom的几率。

     5:对于不同网速,下载解码图片的不同。

     这个也是个技巧,虽然现在4G很普及,但是2G手机也有很多,但网速也有可能很差,所以关于这一点,我将会简单介绍下,这个方法在imageloader中也有使用.

     6:其他的一些代码或者处理技巧。这个我会简单说下。

     针对上面所说的解决方法,我会一一详细说明下,所以文章可能会有些长,但是我相信,当看完后,对于内存溢出的问题大家定有一番收获,如果遇到面试问此类问题或者项目实践时,我也相信大家会游刃有余解决。废话不多说,大家继续往下看:

     针对解决方案1,这个主要靠平时大家对新技术的关注与积累,以下是两个链接,分别是RecylerViewvolley的讲解,RecylerView是可以替代gallerylistview等,效率比它们都高。然后volley是适合快速,简单的请求的网络架构,其实从英语单词意思,大家应该也可以理解它们的意思了吧,啥,你说你四级没过,看不懂,好吧,自己下个灵格斯翻译着看吧,哈哈。

        RecyclerView      

http://blog.csdn.net/ipip2005/article/details/38581427

         volley       

http://blog.csdn.net/jdsjlzx/article/details/40738181

     关于解决方法二和解决方法三,我想讲解一个使用缓存lrucache和本地存储的一个例子,例子的关键代码我会贴上讲解,可是已经有人做讲解了,那好吧 ,贴出它的地址,让大家瞅瞅,反正lrucache原理就是开发者自己设定缓存大小,超出后,就开始清理。

http://blog.csdn.net/xiaanming/article/details/9825113

     关于解决方法46,有人也做了部分讲解,大家可以看看,这个纯粹就是方法的使用技巧了。

http://blog.csdn.net/jiujie_/article/details/7271646

     关于解决方法5,我在上面也讲了,就是imageloader也用了这个方法,因为每一次图片的下载最终都会通过BitmapFactory.decodeStream解析成Bitmap,供ImageView显示。可是在慢速网络需要使用FlushedInputStream来处理。因为在慢速网络中,

BitmapFactory.decodeStream无法正确解析完整的图片。

     以后我会继续总结及创新。3q!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值