Java 为什么Android Studio会对此活动处理程序代码中的处理程序引用泄漏发出警告?
我正在做一些Java 为什么Android Studio会对此活动处理程序代码中的处理程序引用泄漏发出警告?,java,android,Java,Android,我正在做一些活动代码,遇到了一个我不明白的Android Studio警告。以下是生成警告的代码的最低版本: package com.example.test; 导入android.app.Activity; 导入android.os.Bundle; 导入android.os.Handler; 公共类测试活动扩展了活动{ 私有静态处理程序mActivityHandler=新处理程序(){ //Android Studio 1.5.1警告此处存在泄漏 }; 创建时受保护的void(捆绑状态){ s
活动
代码,遇到了一个我不明白的Android Studio警告。以下是生成警告的代码的最低版本:
package com.example.test;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
公共类测试活动扩展了活动{
私有静态处理程序mActivityHandler=新处理程序(){
//Android Studio 1.5.1警告此处存在泄漏
};
创建时受保护的void(捆绑状态){
super.onCreate(state);
mActivityHandler.sendEmptyMessageDelayed(0,10L);
}
}
Android Studio 1.5.1以黄色突出显示注释指示的new Handler(){}
主体,显示以下消息:
处理程序引用泄漏
由于此处理程序被声明为内部类,因此它可能会阻止外部类被垃圾收集。如果处理程序对主线程以外的线程使用循环器或MessageQueue,则没有问题。如果处理程序正在使用主线程的Looper或MessageQueue,则需要修复处理程序声明,如下所示:将处理程序声明为静态类;在外部类中,实例化外部类的WeakReference,并在实例化处理程序时将此对象传递给处理程序;使用WeakReference对象对外部类的成员进行所有引用
代码运行良好(当我为本例剥离的其余代码放回时!),但我希望理解警告并找到修复它的方法
是否有其他方法编写代码以避免此警告?我今天也收到了此警告。虽然我不是像您这样有经验的开发人员,但在这里,您可以将
mActivityHandler
声明为全局对象并实现Handler.Callback
,然后通过传递活动的上下文来实例化mActivityHandler
是否有其他方法编写代码以避免此警告
这有助于我删除Handlerleak的警告。可以找到警告的良好解释和修复方法。由于您创建了匿名
处理程序的静态实例,因此您的特定示例对我很有意思。我很好奇这个警告是否真的适用于这种情况,因为你没有对测试活动的隐式引用。这。解释和建议的补救措施如何是不够的?@323go:我相信对于一个经验丰富的安卓和Java开发人员来说,解释是足够的。但如果我对此感到困惑的话,我想其他人也可能会感到困惑。目前,我很高兴能按原样运行代码,即使有警告。但我当然不喜欢这样的警告!因此,我发布了这个问题,以防它能帮助站在我立场上的其他人。:-)
public class TestActivity extends Activity implements Handler.Callback {
private static Handler mActivityHandler;
protected void onCreate( Bundle state ) {
super.onCreate( state );
mActivityHandler=new Handler(this);
mActivityHandler.sendEmptyMessageDelayed( 0, 10L );
}
@Override
public boolean handleMessage(@NonNull Message msg) {
return true;
}
}