阅读《一文让你彻底理解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不就好了么?

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容