之前的项目时间紧张,开发完一个模块之后就接着开发下一个。现在有空闲时间进行整理与总结,有不对的地方还请路过大神指正~
图片相关
为了防止内存OOM,在展示高分辨率图片的时候,最好先将图片进行压缩。为了避免OOM异常,解析图片的时候都先检查图片的大小,保证这些图片都不会超出你程序的可用内存。加载图片时,为了更好的用户体验,可以先用内存或硬盘缓存即将显示的图片,在进行网络请求前需判断缓存中是否有该图片,没有就下载。另外,还要考虑用户的网络状态是否是移动数据,还是WiFi情况(用户体验)。
内存溢出
个人碰到最多的oom是Handler,图片与单例模式所造成的。
由于Handler变量的生命周期和Activity是不一致,所以很容易导致无法正确释放。解决方案:Handler的持有的引用对象最好使用弱引用,资源释放时也可以清空 Handler 里面的消息。比如在 Activity onStop 或者 onDestroy 的时候,取消掉该 Handler 对象的 Message和 Runnable。
图片主要是控件显示高分辨率的图片而没有进行压缩。
而单例的静态特性也很容易造成内存泄漏(其生命周期与应用的生命周期一样长)。传入的是 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,由于该Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity退出时它的内存并不会被回收,这就造成泄漏了。
总结:在Activoty中避免使用非静态内部类,则其存活期跟 Activity 的生命周期就无关了
优化
强引用,软引用,弱引用 的相关调用Java 如何有效地避免OOM:善于利用软引用和弱引用
Java引用总结–StrongReference、SoftReference、WeakReference、PhantomReference
Java 7之基础 - 强引用、弱引用、软引用、虚引用