在处理handle异步消息处理机制中,我们经常会写出如下代码:
public class HandlerTestActivity extends Activity {
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// ... do something
}
}
}
上面这段代码会引起内存泄漏(Memory Leak)。
为什么会引起内存泄漏?
我们都知道,非static的内部类会持有外部类的引用,举个类子来说,我们经常在一些内部类中显示跳转activity的时候,给Intent赋值的时候,第一个参数会写 外部类名.this ,这就是持有外部类的引用的很好表现。 同样,其他地方需要用到这个内部类的时候,也不能是直接new出来,因为为非static的,必须先通过new出外部类才能。
那么,现在的情况就是,这个非static的handler内部类,无论是否是匿名的,便会持有外部的activity的引用。
若此时你的handler的消息队列中有未处理的Message,在Activity finish之后,Message仍然存在,那么Handler也仍然存在。由于Handler中有Context的引用,那么Context也就存在。而该Context就是我们的Activity,也就是Activity依然存在,那么我们便是发生了内存泄露。
那么为什么要写成静态内部类呢?或者写成其他单独的类呢?
隐性匿名类Handler变成static的内部类,由于static的内部类,使用的时候不需要外部类的实例,所以static的内部类和外部类是没有联系的,