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, потому что его легко реализовать, и вам не нужно управлять самим собой.