为什么Android Studio会在此Activity Handler代码中警告处理程序引用泄漏?

时间:2016-04-20 03:37:51

标签: java android

我正在处理一些Activity代码并遇到了我不明白的Android Studio警告。以下是产生警告的代码的最小版本:

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class TestActivity extends Activity {

    private static Handler mActivityHandler = new Handler() {
        // Android Studio 1.5.1 warns of a leak here
    };

    protected void onCreate( Bundle state ) {
        super.onCreate( state );
        mActivityHandler.sendEmptyMessageDelayed( 0, 10L );
    }
}

Android Studio 1.5.1以黄色突出显示评论指示的new Handler() { }正文,显示以下消息:

  

处理程序引用泄漏

     

由于此Handler被声明为内部类,因此可能会阻止外部类被垃圾回收。如果Handler使用Looper或MessageQueue作为主线程以外的线程,则没有问题。如果Handler正在使用主线程的Looper或MessageQueue,则需要修复Handler声明,如下所示:将Handler声明为静态类;在外部类中,实例化外部类的WeakReference,并在实例化Handler时将此对象传递给Handler;使用WeakReference对象对外部类的成员进行所有引用。

代码运行正常(当我为此示例删除的其余代码被放回!)但我想了解警告并找到解决方法。

是否有其他方法来编写代码以避免此警告?

1 个答案:

答案 0 :(得分:1)

我今天也收到了这个警告。尽管我不是像您这样经验丰富的开发人员,但是在这里,您可以将mActivityHandler 声明为全局对象并实现Handler.Callback,然后通过传递活动的上下文来实例化mActivityHandler。 / p>

还有另一种编写代码的方式来避免此警告?

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

这帮助我消除了 Handlerleak 的警告。