HandlerThread与IntentService

时间:2016-08-12 19:01:57

标签: android android-intentservice android-handlerthread

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

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

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

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

2 个答案:

答案 0 :(得分:7)

因此,在检查了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自己的处理程序,需要在工作完成后终止服务:

    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的组合。

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

答案 1 :(得分:0)

  

如果用户多次轻按,则新任务将排队,仅在完成第一个任务时启动第二个任务。我应该使用什么?

IntentService和HandlerThread都可以做到这一点。在HandlerThread中,可以通过与它一起使用处理程序来完成它,但是如果是IntentService,则由它自己管理。

  

IntentService或HandlerThread?

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