我正在开发一个服务,它扩展了Service类并使用一个单独的线程来处理传入的消息,因此,我在onCreate方法中有以下内容
thread = new HandlerThread("MYSERVICE-THREAD",
Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(mServiceLooper);
在这个帖子中,我创建了一个LocationManager并将其设置为监听位置变化。我有点担心线程的生命周期。这就是原因:
如果我不从服务的onDestroy方法中的位置管理器中删除位置侦听器,并通过telnet强制进行位置更新,一切正常。我发现这很奇怪,并尝试在服务的onDestroy方法中使用thread.quit()显式结束线程。所以,现在当从telnet进行位置更新时,我得到了我首先想到的警告。处理程序在死线程上调用处理程序。
从位置管理器中删除位置监听器显然解决了这个问题,但是,这似乎暗示我如果我没有显式关闭线程,那么线程将在服务被销毁后继续运行。它是否正确?在developer.android.com上的示例中,他们没有明确地关闭他们的线程,所以我认为VM会在这种情况下处理它。
答案 0 :(得分:3)
哦,是的。情况就是这样。活动也是如此。线程保持打开状态,直到Android明确杀死它们以释放资源,除非你自己关闭它们。从技术意义上讲,从堆栈弹出时,活动和服务永远不会关闭。它只是告诉操作系统,他们正在使用的所有资源现在都可以在需要时回收,以便内存池将成为操作系统的第一个位置。如果任何类型的线程仍在运行,它将继续运行(并占用CPU资源),直到内存被回收,这可能是1秒到12周之间的任何时间。
答案 1 :(得分:2)
这似乎暗示我,如果我没有显式关闭该线程,该线程将在服务被销毁后继续运行。这是对的吗?
绝对。如果你分叉线程,你必须清理它。
所以我认为VM会在这种情况下处理它。
好吧,最终,它会最终终止您的应用程序的整个过程。话虽这么说,你不想泄漏线程,你真的不希望泄漏requestLocationUpdates()
调用(或者你使用LocationManager
时的任何内容)因为这可以使位置提供商保持通电(例如,GPS)。
在developer.android.com上的示例中,他们没有明确地关闭他们的线程
您指的是哪些示例?