Android - mainThread处理程序会导致内存泄漏吗?

时间:2017-01-05 05:25:20

标签: android memory-leaks handler

我很好奇为什么下面是内存泄漏,因为mHandler是在mainThread上创建的,现在调用onDestroy时它会不会杀死线程?在销毁活动后,处理程序如何存在?我还没有新的主题。我是否理解一个处理程序,如果它有消息队列的东西,即使在一个线程被销毁后仍会保留?

参考文档正在阅读https://www.googleapis.com/identitytoolkit/v3/relyingparty/uploadAccount here

2 个答案:

答案 0 :(得分:17)

Handler's主要用于将事件发布到Thread的MessageQueue。每个Handler实例都与一个线程和该线程的消息队列相关联。

所以当你发布一个有延迟的runnable并退出活动时,MainThread不会被销毁,因为MessageQueue中仍有一些事件要在延迟后处理,所以这会导致 memoryLeak ,因为您的匿名内部类runnable持有活动 实例的引用。

所以请务必通过调用

删除Activity的 onStop()中的所有邮件
handler.removeCallbacksAndMessages(null);

这将在离开您的活动之前清除所有待处理的消息和回调。

答案 1 :(得分:0)

他们可以,但不是发布的Runnable的Handler。 Handler的工作方式是它与Thread相关联。那个线程必须有一个Looper。 Looper有一个消息队列。 postdelayed时,将Runnable添加到该Looper的消息队列中。所以Thread本身有一个Runnable的引用。因此Runnable会被泄露,如果是非静态的,那么父类将被泄露。