Handler 导致的 Activity 泄露问题

泄露是什么含义?
就是对象该回收的时候无法回收。一般而言就是你的Activity执行finish方法的时候,如果你的消息队列还有延迟的异步消息,当这个Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,所以导致该Activity的内存资源无法及时回收,引发内存泄漏。

消息队列的生命周期是进程级别的,也就是跟你的应用进程是相同的。延迟消息跟Activity没关系,怎么说呢,延迟消息的生命周期可以远远大于Activity,你的Activity不见了,只是Activity栈中做了出栈的操作,这个Activity还没被销毁,里面控件展示啥的不影响。

一般我们用handler的时候直接

private Handler mHandler = new Handler();

这样就跟activity建立引用了。
activity跟handler的关系就是一对多的关系。一个activity里面可以新建很多handler,但是我们一般用的是一个activity里面用一个handler。

怎么防止泄露呢?
在onDestroy方法中添加如下代码:

 mHandler.removeCallbacksAndMessages(null);

移除消息队列中所有消息和所有的Runnable。没有message的引用的话,就算handler跟activity有引用也照样销毁。

你可能感兴趣的:(Handler 导致的 Activity 泄露问题)