使用LeakCanary进行内存泄漏追踪
LeakCanary使用
1.在build.gradle 中
dependencies {
//添加
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
}
2.如图:在Applaction onCreate()中
![](https://images2018.cnblogs.com/blog/672058/201805/672058-20180508132934089-1973037787.png)
调用如下代码对LeakCanary进行初始化
![](https://images2018.cnblogs.com/blog/672058/201805/672058-20180508133005230-1953233224.png)
3.实例:
在启动ChangeAgreementActivity 时会new 一个Fragment:ChangeAgreementFragment,在该fragment 的基类中调用了SharedPreferencesHelper类,在该类中通过单例模式持有了一个context,当ChangeAgreementActivity destory时,其Context会一直存在于单例中,由此引起内存泄漏。
![](https://images2018.cnblogs.com/blog/672058/201805/672058-20180508133036012-1188620303.png)
现象:在启动app中某个Activity时会出现下图表示该页面存在内存泄漏:
![](https://images2018.cnblogs.com/blog/672058/201805/672058-20180508133049721-415209968.png)
可以通过点击通知栏orLeakCanary的icon查看泄漏记录图下图,进而追踪到SharedPrefreencesHelper中
![](https://images2018.cnblogs.com/blog/672058/201805/672058-20180508133633937-1487437156.png)
修改思路:使用WeakReference 关联Context。
具体实施:
参见:SharedPreferencesHelper图的第二个红框上边注释的代码:mContext = ApplicationMy.getInstance();直接在SharedPreferencesHelper中调用Applaction中的Context。 而getInstance()在ApplicationMy的基类中,具体实现:
![](https://images2018.cnblogs.com/blog/672058/201805/672058-20180508133120412-702681317.png)