Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Android Studio会对此活动处理程序代码中的处理程序引用泄漏发出警告?_Java_Android - Fatal编程技术网

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;
    }
}