Handler警告解决方法
用Handler的时候
经常出现一个警告
This Handler class should be static or leaks might occur
这个Handler类应该被设成static,否则有可能内存泄漏
为什么呢
原因:
首先我们复习一下handler机制
消息发送到主线程,添加到消息队列中,然后Looper循环接收消息
注意了,在消息队列里面排队的消息保持了对目标Handler类的引用,
如果Handler是个内部类,那么它也会保持它所在的外部类(一般就是Activity或Service等),
只要有消息在队列里面,
那么Handler就无法被回收,
如果Handler不是static,那么用Handler的Activity或Service也不能被回收
这就导致了内存泄漏
解决:
我们可以在Handler中保持一个外部类的弱引用
来个static类,继承Handler
public static class MyHandler extends Handler{
WeakReference mOuterClass;
MyHandler(OuterClass clz) {
mOuterClass clz= new WeakReference(clz);
}
//成员变量弱引用=外部类引用
@Override
public void handleMessage(Message msg) {
OuterClass clz= mOuterClass.get();
switch (msg.what) {
case what:
clz.method();
break;
defaule:
break;
}
}
}
这样的话传入的外部类就都是弱引用了
声明之后
就可以用handler了
private MyHandler handler = new MyHandler(this);