今天说一下作为新手的我们经常犯的错—-以activity等作为参数造成双重引用而产生的内存泄漏【不论伪MVC还是MVP,只要存在模块引用了有自己生命周期的对象】。DDMS(Monitor->system info好像)、Findbugs等一些工具是可以检测到的,但我觉得集成leak检测最省事,android有像leakcanary这样的开源框架。
而Android studio总是会提示你Handler建议使用static,很多人应该都见过。使用static(类变量)确实能够保证当前activity是”单例”且不持有外部引用“this”,但造成的麻烦是,static的类中不能使用外部实例变量。而一般情况下MainActivity(主界面)都会持有一些实例变量,且仍然存在双重引用。
相信使接触过Camera、大量图片处理(一般用软引用避免OOM,最大程度保证对象使用内存)以及其他必须手动去释放资源工具的同学应该清除弱引用WeakReference(弱引用),它能保证在系统调用GC时就会被系统释放资源。
下面以Handler为例,粗略看一下普遍防止内存泄漏的做法:
1. 在Activity中声明Handler类并懒汉初始化Handler:
private static class MainHandler