这篇文章不是想要把LeakCanary的原理给讲一遍,这些东西大牛们已经写的非常好了。有时候不太想写这方面的博客的原因是前辈们已经写得太好了,重复造车,没什么意思,而且即使写出来了,跟人家的一比,没法超越他们,也就不班门弄斧了。
之所以写这篇文章,是因为在看完LeakCanary原理之后,WeakReference好像有点不一样了。
抛出一个问题,LeakCanary检测内存泄漏是如何发现内存泄漏的?这里简单描述下:
LeakCanary对Application的activity生命周期做了监听:
public final class ActivityRefWatcher {
private final ActivityLifecycleCallbacks lifecycleCallbacks = new ActivityLifecycleCallbacks() {
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
public void onActivityStarted(Activity activity) {
}
public void onActivityResumed(Activity activity) {
}
public void onActivityPaused(Activity activity) {
}
public void onActivityStopped(Activity activity) {
}
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
public void onActivityDestroyed(Activity activity) {
ActivityRefWatcher.this.onActivityDestroyed(activity);
}
};
void onActivityDestroyed(Activity activity) {
this.refWatcher.watch(activity);
}
public void watchActivities() {
this.stopWatchingActivities();
this.application.registerActivityLifecycleCallbacks(this.lifecycleCallbacks);
}
上面是关键代码,