我应该在销毁活动时手动关闭由我的应用程序创建的HandlerThreads吗?

Dan*_* L. 9 android activity-lifecycle android-handler

我的应用程序由一个单独组成Activity.在这个活动中,我正在创建多个HandlerThreads,它们在循环中运行以执行套接字阻塞操作.

目前我HandlerThread在我的期间向这些人发布了一条戒烟信息Activity.onDestroy().

有时,当我打开我的应用程序,关闭它并重新启动它时,它会崩溃(很多时候是由于向未运行的处理程序线程发送消息).

我的问题是:关闭我的应用程序时关闭的正确方法HandlerThread什么(请注意,那些线程可能在套接字操作上阻塞).

编辑:更多信息: 我有一个处理程序线程池,它是在onCreate中启动的(当我第一次启动我的应用程序时没问题).

每个处理程序runnable循环都包含一个

 if (shouldRun) {
//body
} 
else { 
 close();
}
Run Code Online (Sandbox Code Playgroud)

声明.

close方法删除所有挂起的消息和runnables,并向处理程序发送一条消息,使其调用它looper.quit().这样,如果当前处理程序线程被IO操作阻止,只有一旦它完成它,他将退出().

cla*_*ker 1

  • 你必须有一些不一致的地方,否则你的应用程序不会崩溃。您确定未运行的 HandlerThread确实是原因吗?创建Activity时不创建HandlerThread对象吗?
  • 如果您的 HandlerThreads 正在等待 I/O 操作,我会考虑尝试中断它们。简单地删除回调和消息并要求 Looper 退出,甚至向 Handler 发送终止消息,都不会起任何作用。HandlerThread 对象将仍然存在,直到 Android 杀死进程(这可能会发生,也可能不会发生)。这意味着“您的应用程序将收集僵尸 HandlerThread 对象”,这些对象可能无法访问。当然,除非您可以向这些 HandlerThreads 发送一条终止消息,该消息到达它们阻塞的通道。
  • 重用 HandlerThread 对象会更好。服务可能是执行此操作的正确模型。
  • 另外,如果线程在您的活动中幸存下来,您需要通知它们,他们的通信对等点(您的活动)已经消失。否则,它们可能会引用已经消失的东西。