HandlerThread与IntentService对比

10
我想请有经验的人解释一下,HandlerThread和IntentService之间的主要区别是什么,以及它们的主要使用场景是什么?
我了解到 HandlerThread 包含一个Looper,它管理着由Handler提供给消息队列(messageQueue),只要推送任务到HandlerThread,它就会执行。这是用于非与UI相关的长时间运行操作的绝佳工具,您可以通过 runOnUiThread() 将结果推送回UI。
相比之下, IntentService 适用于长时间运行的非UI相关操作,可以按顺序执行任务,完成任务后会调用 selfStop () 来关闭自身。如果IntentService正在处理任务,则会将新请求添加到队列中,并在完成第一个任务后处理第二个任务。
从我的角度来看,它们以非常相似的方式执行相同的工作。 假设我有一个应用程序,用户点击按钮后,我开始下载文件。如果用户多次点击,则会排队新任务,只有在第一个任务完成后才启动第二个任务。 我应该使用IntentService还是HandlerThread?
2个回答

10

因此,在检查HandlerThread和IntentService的源代码后,我发现以下内容:

  • IntentService内部有一个HandlerThread实例(这是单独的工作线程)
  • IntentService在执行完onHandleIntent()方法后,调用selfStop()来关闭自身(因为它扩展了Service类)。
  • 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的组合。

欢迎提供更多答案和解决方案!


0
如果用户多次点击,新任务将被排队,只有在第一个完成后才启动第二个。我应该使用什么?
IntentService和HandlerThread都可以做到这一点。在HandlerThread中,您可以通过使用处理程序来实现它,但在IntentService的情况下,它会自行管理。
IntentService还是HandlerThread?
您举了下载文件的例子,但在这种情况下,用户还想停止它。 在这种情况下,您无法使用IntentService以正确的方式停止它(它将在下载后自动停止)。因此,您必须使用HandlerThread和Service继续进行。 但是,如果您的情况不是这样的,那么您可以使用IntentService,因为它易于实现,而且您不必自己管理。

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