阅读《一文让你彻底理解LeakCanary的工作原理》

原文地址
https://mp.weixin.qq.com/s/UfxG41HInNfv9nkDvKpcZQ

『尝试去清除一次activity的key队列,然后检测被destroy的activity是否已经被回收,如果没有被回收,也不一定发生了泄漏,因为可能还没有进行过gc,所以我们手动进行了一次gc,然后再次检测该activity 对应的key是否还在key队列,如果还在,那么就说明发生了泄漏』

两次 gc,两次清除 key 队列。

key 是 activity 的 key,也就是一一对应。

但是这里有三者关系。弱引用,key,activity。

 String key = UUID.randomUUID().toString();
  // 将这个Activity对应的key添加到集合retainedKeys中
  retainedKeys.add(key);
  // 核心代码,创建一个弱引用,指向这个Activity并且指定一个引用队列
  final KeyedWeakReference reference = new KeyedWeakReference(watchedReference, key, referenceName, queue);

弱引用队列里存的是什么?存的是 key
清除弱引用队列的时候,也会循环遍历去清除另一个 retainedKeys集合里的 key。

那么这里三者关系是
activityA 的 key -》keyA
第一次清除,activityA 没有被回收,无所谓,清理弱引用队列也不会有任何东西,那么retainedKeys还会有 keyA,因为没有被遍历remove keyA,到这里都无所谓。

当 activityA 真实被回收,keyA 会放到弱引用队列里,此时遍历 remove retainedKeys
即遍历清除了retainedKeys里的这个 keyA,说明被真实回收了。

如果回收不了,retainedKeys必有 keyA,用 keyA 存不存在来判断泄露与否。

我的问题:为什么要用retainedKeys? 直接判断弱引用队列存不存在activityA不就好了么?

答:要清理两次弱引用队列,清理了就判断不了吧。

你可能感兴趣的:(阅读《一文让你彻底理解LeakCanary的工作原理》)