我很好奇为什么下面是内存泄漏,因为mHandler是在mainThread上创建的,现在调用onDestroy时它会不会杀死线程?在销毁活动后,处理程序如何存在?我还没有新的主题。我是否理解一个处理程序,如果它有消息队列的东西,即使在一个线程被销毁后仍会保留?
参考文档正在阅读https://www.googleapis.com/identitytoolkit/v3/relyingparty/uploadAccount here
答案 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会被泄露,如果是非静态的,那么父类将被泄露。