HandlerThread与IntentService

问题描述 投票:7回答:2

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

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

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

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

android android-intentservice android-handlerthread
2个回答
8
投票

因此,在检查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的组合。

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


0
投票

如果用户多次点击,则新任务将排队,仅在第1次完成时启动第2次。我该怎么用?

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

IntentService还是HandlerThread?

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

© www.soinside.com 2019 - 2024. All rights reserved.