需要退出HandlerThread吗?

12

我的应用程序使用HandlerThread来执行一些需要在后台线程上运行的操作,这些操作在组件之间共享。大部分时间该线程将处于等待状态。

我可以让这个HandlerThread保持运行(等待)在我的应用程序中,每当需要时向其发送消息,但从未通过HandlerThread.getLooper().quit()退出它吗?这意味着即使所有应用程序组件都被销毁后,这个HandlerThread仍将以其等待状态继续存在。

最初,这似乎是一个不能做的事情——我绝对不会这样做——但现在我不确定了。当Android杀死我的进程时,就像当它需要释放CPU时间或内存时一样,它将结束这个线程以及我的UI线程。此外,该线程将处于等待状态,因此不会消耗任何CPU时间。除此之外,我的应用程序使用了许多AsyncTasks,我知道它们利用了线程池。据我所知,AsyncTask利用ThreadPoolExecutor,后者不遵循任何应用程序生命周期回调(不使用池中的线程,只需坐等)。

因此,我的问题是,我可以在多个应用程序组件之间使用HandlerThread,从不(或很少)退出它,并在不使用时让它等待,而不会遭受可怕的副作用吗?

1个回答

0

我的个人偏好是在需要时创建一个新线程,并在完成后清理它。这样,我就不会遇到多个组件同时尝试使用同一线程的问题,并且保持“干净的船”。此外,Android有很好的AsyncTask,可以为您轻松实现此功能。

话虽如此,只要您控制对线程的访问并在销毁活动时正确清理它,我认为您可以重复使用您的handlerthread以服务于多个组件。如果我正确理解了this post,即使所有活动都被终止,您的线程也可能继续运行,因为您的进程可能仍在运行。为解决这个问题,您可以将您的线程设置为守护线程。守护线程在应用程序中的最后一个非守护线程完成后会自动销毁。

顺便说一句,您还可以考虑使用ThreadPoolExecutor


1
我不同意你的观点,因为如果你必须在另一个线程上执行某个任务多次,那么会创建很多线程,这可能会导致应用程序崩溃。 - Boldijar Paul
1
是的和不是的。如果您有许多并行操作,那么您是正确的,最好重用1(或少数)线程。如果是在系列中执行相同的操作,则可以选择任何一种方式。只要您正确清理线程,您的应用程序就不会崩溃。在我的应用程序中,相同的操作仅在每x分钟执行一次,因此销毁线程更容易且更节省内存。 - THelper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接