HandlerThread 与 IntentService

Posted

技术标签:

【中文标题】HandlerThread 与 IntentService【英文标题】:HandlerThread vs IntentService 【发布时间】:2016-12-19 20:59:49 【问题描述】:

想请人解释一下,HandlerThread和IntentService的主要区别是什么,主要的用例场景是什么?

我了解 HandlerThread 包含一个 Looper,它管理由 Handler 提供的 messageQueue。据我了解,您可以为 HandlerThread 推送任务并且它将执行。它非常适合用于非 UI 相关的长时间运行操作,您可以通过 runOnUiThread() 将结果推送回 UI。

相比之下,IntentService 适合长时间运行的非 UI 相关操作,可以按顺序执行任务,当它完成调用 selfStop() 以关闭自身完成的作业时。如果 IntentService 正在处理一项任务,当一个新请求到达时,它会添加到队列中并处理第二个,当它完成第一个时。

在我看来,他们以同样的方式做着同样的工作。 假设我有一个应用程序,用户点击一个按钮,我开始下载一个文件。如果用户多次点击,则新任务将排队,仅在第一个任务完成时启动第二个任务。 我应该使用什么? IntentService 还是 HandlerThread?

【问题讨论】:

【参考方案1】:

所以,在查看了 HandlerThread 和 IntentService 的源代码后,我发现如下:

IntentServie 内部有一个 HandlerThread 实例(这是分离的工作线程) IntentService 在执行 onHandleIntent() 方法后调用 selfStop() 以关闭自身(因为它正在扩展服务类)。 IntentService 是从 Service 类本身扩展而来的,因此如果您愿意,可以在单独的进程中启动它。

IntentService onCreate() 方法,创建工作线程:

   @Override
public void onCreate() 
    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);

IntentService自己的handler,工作完成后需要杀死服务:

    private final class ServiceHandler extends Handler 
    public ServiceHandler(Looper looper) 
        super(looper);
    

    @Override
    public void handleMessage(Message msg) 
        onHandleIntent((Intent)msg.obj);
        stopSelf(msg.arg1);
    

在我的阅读中IntentService是HandlerThread和Service的结合。

非常欢迎任何进一步的答案和解决方案!

【讨论】:

【参考方案2】:

如果用户点击多次,一个新任务会排队,只有在第一个任务完成后才会启动第二个任务。我应该使用什么?

IntentService 和 HandlerThread 都可以做到这一点。在 HandlerThread 中,您可以通过使用处理程序来完成它,但在 IntentService 的情况下,它会在它自己的情况下进行管理。

IntentService 还是 HandlerThread?

您正在举一个下载文件的示例,但在这种情况下,用户也想停止它。 在这种情况下,您无法使用 IntentService 以正确的方式执行此操作,因为在下载之间没有任何官方方法可以停止它(下载后它会自动停止)。因此,您必须继续使用 HandlerThread 和 Service。 但是,如果您的情况不是这样,那么您可以使用 IntentService,因为它易于实现且您不必自行管理。

【讨论】:

以上是关于HandlerThread 与 IntentService的主要内容,如果未能解决你的问题,请参考以下文章

HandlerThread原理与应用

主线程与子线程之间相互通信(HandlerThread)

HandlerThread的简单分析

Android Thread和HandlerThread的差别

Android Thread和HandlerThread的差别

HandlerThread解析