2012-05-23 3 views
10

В android, Handler можно использовать для отправки/обработки сообщения, если я не использую HandlerThread (передаю его Looper to Handler), означает ли это, что в этом случае Handler использует MainThread (UI Thread) Лупер?Зачем использовать HandlerThread в Android

Какой результат получится, если Handler использует Looper MainThread? Может заблокировать mainThread?

ответ

4

Как Doc говорит:

Handy класс для запуска нового потока, который имеет петлитель.
Затем можно использовать петлитель для создания классов обработчиков.
Обратите внимание, что start() еще нужно вызвать.

HanderThread класс наследует от класса Thread, который инкапсулирует объект Looper, так что мы не заботимся петлителя открытым и освободить детали. Как и в случае обычной нити, мы должны использовать Looper.prepare() и Looper.loop(), чтобы преобразовать его как LooperThread.

4

Нормальный способ использовать HandlerThread как это:

HandlerThread thread = new HandlerThread("A Handler Thread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //.... 
    } 
}; 

Поскольку HandlerThread может создать Looper для Handler, это своего рода удобным способом.

При создании нового обработчика, он привязан к очереди поток/сообщение из потока, который ее создает - см официальные документы ...

+0

Это официальные документы. 'Удобный класс для запуска нового потока с петлером. Затем петлитель можно использовать для создания классов обработчиков. Обратите внимание, что start() еще нужно вызвать. 'Я сэкономил ваше время. – UnKnown

10

Вы бы использовать HandlerThread в случае, если вы хотите выполнить фоновые задачи по одному, и вы хотите, чтобы эти задачи выполнялись в порядке выполнения.

Например, если вы хотите сделать несколько сетевых фоновых операций один за другим.

Да, у HandlerThread есть собственный петлитель, и обработчики могут быть созданы и отправлены, поэтому он не будет блокировать основной поток.

0

HandlerThread полезен, когда вы хотите выполнить много фоновых задач, так как у него есть собственный петлитель. Обычно, если вы отправляете сообщение обработчику, он использует петлитель MainThread. Это означает, что задача выполняется в потоке пользовательского интерфейса. Но в случае HandlerThread эти задачи выполняются в рабочем потоке. Вы можете найти более подробное объяснение here

2

, если я не использую HandlerThread (передать его петлитель Handler), это означает в этом случае обработчик использовать MainThread (UI Thread) «s Looper?

Посмотрите документацию Handler

Handler() 

конструктор по умолчанию связывает этот обработчик с Looper для текущего потока.

Если ваш текущий поток MainThread, он использует MainThread (UI Thread) Looper.

Чтобы явно связать обработчик с вашим 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, выполняющего операцию сетевого ввода-вывода.

Вы можете найти пример кода @How do I fix android.os.NetworkOnMainThreadException?

Какой результат будет получить, если обработчик использует Looper MainThread в? Может заблокировать mainThread?

Если вы отправляете много событий в MainThread Looper, они будут выполняться непосредственно на MainThread (UI Thread). Если заданные задачи занимают больше времени для выполнения, MainThread будет заблокирован.

Проверить ниже должности для внутренностей Looper:

What is the purpose of Looper and how to use it?

Смежные вопросы