【Android】Handler为什么会造成内存泄漏

首先,要明确一个知识点

在java中,匿名内部类会持有外部类引用

比如我们在Activity中通过以下方式创建Handler


	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方法,移除所有尚未处理的消息

你可能感兴趣的:(android,android,java,handler,内存泄漏)