Android - mainThread 处理程序会导致内存泄漏吗?
Android - can mainThread handlers cause memory leaks?
我很好奇为什么下面是内存泄漏,因为 mHandler 是在 mainThread 上创建的,现在当调用 onDestroy 时它不会杀死线程吗? activity 被销毁后处理程序如何存在?我还没有发新帖。我是否理解一个处理程序如果它有东西,即使在线程被销毁后消息队列仍将保留?
我正在阅读的参考文件是here
他们可以,但不是发布的 Runnable 的 Handler-。 Handler 的工作方式是它与 Thread 相关联。该线程必须有一个 Looper。 Looper 有一个消息队列。 postDelayed 时,将 Runnable 添加到 Looper 的消息队列中。所以 Thread 本身有一个对 Runnable 的引用。这样 Runnable 就会被泄露,如果是非静态的,父 class 就会被泄露。
处理程序主要用于 post 事件到线程的 MessageQueue。每个处理程序实例与单个线程和该线程的消息队列相关联。
所以当你post一个带有延迟的runnable,并从activity退出时,MainThread不会被销毁,因为MessageQueue中仍有事件需要延迟处理,因此这可能会导致 memoryLeak,因为您的 runnable 匿名内部类持有 activity instance[ 的引用=24=]。
因此请确保通过调用
删除 Activity 的 onStop() 中的所有消息
handler.removeCallbacksAndMessages(null);
这将在您离开 activity 之前清除所有待处理的消息和回叫。
我很好奇为什么下面是内存泄漏,因为 mHandler 是在 mainThread 上创建的,现在当调用 onDestroy 时它不会杀死线程吗? activity 被销毁后处理程序如何存在?我还没有发新帖。我是否理解一个处理程序如果它有东西,即使在线程被销毁后消息队列仍将保留?
我正在阅读的参考文件是here
他们可以,但不是发布的 Runnable 的 Handler-。 Handler 的工作方式是它与 Thread 相关联。该线程必须有一个 Looper。 Looper 有一个消息队列。 postDelayed 时,将 Runnable 添加到 Looper 的消息队列中。所以 Thread 本身有一个对 Runnable 的引用。这样 Runnable 就会被泄露,如果是非静态的,父 class 就会被泄露。
处理程序主要用于 post 事件到线程的 MessageQueue。每个处理程序实例与单个线程和该线程的消息队列相关联。
所以当你post一个带有延迟的runnable,并从activity退出时,MainThread不会被销毁,因为MessageQueue中仍有事件需要延迟处理,因此这可能会导致 memoryLeak,因为您的 runnable 匿名内部类持有 activity instance[ 的引用=24=]。
因此请确保通过调用
删除 Activity 的 onStop() 中的所有消息handler.removeCallbacksAndMessages(null);
这将在您离开 activity 之前清除所有待处理的消息和回叫。