我正在处理一些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对象对外部类的成员进行所有引用。
代码运行正常(当我为此示例删除的其余代码被放回!)但我想了解警告并找到解决方法。
是否有其他方法来编写代码以避免此警告?
答案 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 的警告。