首先,要明确一个知识点
在java中,匿名内部类会持有外部类引用
比如我们在Activity中通过以下方式创建Handler
java">
Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
}
};
那么,Handler将持有Activity
最终的对象引用链为:
ThreadLocal -> Looper -> MessageQueue -> Message -> Handler -> Activity
而ThreadLocal是一个static final变量,它是GC Root节点,永远不会被释放
所以被其间接引用的Activity,也不会被释放
解决方案是:
- 将Handler定义为一个static类,而不是匿名内部类
- 在Activity销毁前,调用Handler.remove方法,移除所有尚未处理的消息