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);
}
}
}
}
本文详细解释了在Android开发中如何避免由Handler引起的内存泄漏。主要讨论了非静态内部类和匿名类持有对外部类引用的问题,以及如何通过将Handler声明为静态嵌套类并使用弱引用解决这一问题。
1503

被折叠的 条评论
为什么被折叠?



