Android 为什么处理程序泄漏问题赢了';除主线程外,其他线程中不会发生任何错误

Android 为什么处理程序泄漏问题赢了';除主线程外,其他线程中不会发生任何错误,android,Android,我在活动中有如下代码 Handler handler = new Handler(){ @Override public void dispatchMessage(Message msg) { super.dispatchMessage(msg); } }; Android Studio lint: 处理程序引用泄漏 由于此处理程序被声明为内部类,因此它可能会阻止外部类被垃圾收集如果处理程序使用主线程以外的线程的循

我在活动中有如下代码

Handler handler = new Handler(){
        @Override
        public void dispatchMessage(Message msg) {
            super.dispatchMessage(msg);
        }
    };
Android Studio lint:

处理程序引用泄漏

由于此处理程序被声明为内部类,因此它可能会阻止外部类被垃圾收集如果处理程序使用主线程以外的线程的循环器或消息队列,则没有问题。如果处理程序使用主线程的循环器或消息队列,则需要修复处理程序声明,如下所示:将处理程序声明为静态类;在外部类中,实例化外部类的WeakReference,并在实例化处理程序时将此对象传递给处理程序;使用WeakReference对象对外部类的成员进行所有引用


我知道处理程序引用泄漏,因为它持有活动的强引用,并且该活动不能通过垃圾收集来收集,但为什么处理程序泄漏问题不会发生在主线程以外的线程中?主线程的生命周期与应用程序的生命周期一样长?

Android Studio lint谈到Looper或MessageQueue中的处理程序。 例如:

类LooperThread扩展线程{
公共管理者;
公开募捐{
Looper.prepare();
mHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
//在此处处理传入消息
}
};
loop.loop();
}
}
这显然不包含对任何活动的引用,因此不会泄漏。

如果您查看实现,那么您将看到最初它不会将自己的引用传递给任何外部(即Looper)对象。一旦您输入了一条消息,它就会将其引用传递到外部,
引用被分配给消息
目标
字段。现在,如果您的消息是长期存在的(发布延迟更长),那么它可能会超过您的活动寿命,从而导致资源泄漏。实际原因是主线程消息队列,它保存了一条关于处理程序的消息,该处理程序还包含对活动的引用。当处理程序在活动中是内部静态的时,就会发生此引用泄漏

现在让我们用其他线程消息队列替换主线程消息队列。因为这就是警告信息所说的。假设您的处理程序对您的活动仍然是内部静态的,但它使用了其他线程的循环器,假设您希望以一定的延迟将消息发布到此线程。一旦延迟的消息进入此工作线程的消息队列,它仍然会导致引用泄漏-它将无限期地保留对处理程序的引用,该处理程序也将保留对活动的引用

因此,我的理解是,在上述情况下,这个警告并不完全正确。也许我错过了什么


您可以争辩说,一旦调用Activity.onDestroy,该线程就可以终止,这当然可以防止此处的引用泄漏。

您找到答案了吗?因为不到三年后,我就有了同样的问题。