原文地址
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不就好了么?
答:要清理两次弱引用队列,清理了就判断不了吧。