HandlerThread против IntentService

Я хотел бы попросить кого-нибудь объяснить мне, пожалуйста, каковы основные различия между HandlerThread и IntentService, и каковы основные сценарии использования?

Я понимаю, что HandlerThread содержит Looper, который управляет messageQueue, которое передается обработчиком. Насколько я понимаю, вы можете выдвинуть задачу для HandlerThread, и она будет выполнена. Это отличная вещь для долгосрочных операций, не связанных с пользовательским интерфейсом, где вы можете отправить результаты обратно в пользовательский интерфейс с помощью runOnUiThread ().

Напротив, IntentService хорош для длительных операций, не связанных с пользовательским интерфейсом, может выполнять задачи последовательно, когда это делается с заданиями, которые он вызывает selfStop(), чтобы завершить себя. Если IntentService работает над задачей, при поступлении нового запроса он добавляется в очередь и обрабатывает 2-й, когда он завершается 1-м.

С моей точки зрения, они выполняют одну и ту же работу, совершенно одинаково. Предположим, у меня есть приложение, где пользователь нажимает на кнопку, я начинаю скачивать файл. Если пользователь нажимает несколько раз, новое задание ставится в очередь, запускает второе только тогда, когда первое выполнено. Что я должен использовать? IntentService или HandlerThread?

1 ответ

Решение

Итак, после проверки исходного кода HandlerThread и IntentService я обнаружил следующее:

  • IntentServie имеет экземпляр HandlerThread внутри (это отдельный рабочий поток)
  • IntentService вызывает selfStop() после выполнения метода onHandleIntent(), чтобы отключить себя (так как он расширяет класс обслуживания).
  • 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.

Любые дальнейшие ответы и решения приветствуются!

Если пользователь нажимает несколько раз, новая задача ставится в очередь, запускает 2-е только тогда, когда 1-е выполнено. Что я должен использовать?

IntentService и HandlerThread оба могут сделать это. В HandlerThread вы можете сделать это с помощью обработчика, но в случае IntentService он управляет самостоятельно.

IntentService или HandlerThread?

Вы приводите пример загрузки файла, но в этом случае пользователь также хочет остановить его. В этом случае вы не можете сделать это правильно с помощью IntentService, потому что нет никакого официального способа остановить его между загрузками (он автоматически остановится после загрузки). Итак, вы должны двигаться дальше с HandlerThread и Service. Но если ваш случай не такой, то вы можете воспользоваться IntentService, потому что его легко реализовать, и вам не нужно управлять самим собой.

Другие вопросы по тегам