если я не использую HandlerThread (передаю его Looper в Handler), означает ли это, что в этом случае Handler использует Looper MainThread (поток пользовательского интерфейса)?
Ознакомьтесь с документацией по Handler.
Handler ()
Конструктор по умолчанию связывает этот обработчик с Looper для текущего потока.
Если ваш текущий поток — MainThread, он использует цикл MainThread (поток пользовательского интерфейса).
Чтобы явно связать Handler с вашим MainThread (потоком пользовательского интерфейса), напишите ниже код.
Handler mHandler = new Handler(Looper.getMainLooper();
Если вы пишете, как показано ниже, он использует HandlerThread Looper.
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
Если у вас есть какая-либо сетевая операция ввода-вывода в задаче Runnable
, вы не можете использовать зацикливатель основного потока. В этом случае HandlerThread
удобно опубликовать Runnable
задачу, выполняющую операцию сетевого ввода-вывода.
Вы можете найти пример кода @ Как исправить android.os. Исключение NetworkOnMainThreadException?
Какой результат получится, если обработчик использует Looper MainThread? Может привести к блокировке mainThread?
Если вы отправляете много событий в MainThread Looper, они будут выполняться в самом MainThread (UI Thread). Если отправленные задачи требуют больше времени для выполнения, MainThread будет заблокирован.
Ознакомьтесь с постом ниже, чтобы узнать о внутреннем устройстве Looper:
Какова цель Looper и как им пользоваться?
person
Ravindra babu
schedule
11.02.2017