Android Handler
程序员文章站
2022-07-14 18:26:00
...
Android Handler
static or leaks
This Handler class should be static or leaks might occur (anonymous android.os.Handler).
Handler 类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那 么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。
在Java 中:非静态的内部类和匿名类都会隐式的持有一份对外部类的引用,而静态的内部类则不会包含对外部类的引用。
有如下两种解决方法:
(1)官方建议
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
(2)静态类
static class MyHandler extends Handler {
WeakReference<OuterClass> outerClass;
MyHandler(OuterClass activity) {
outerClass = new WeakReference<OuterClass>(activity);
}
@Override
public void handleMessage(android.os.Message msg) {
OuterClass theClass = outerClass.get();
switch (msg.what) {
case 0: {
//使用theClass访问外部类成员和方法
break;
}
default: {
Log.w(TAG, "未知的Handler Message:" + msg.what);
}
}
}
}