Страницы

Поиск по вопросам

пятница, 5 апреля 2019 г.

Зачем передавать Looper в Handler?

В офф документации очень коротко описано о том, что такое Looper
Можете объяснить что это и зачем его передавать в Handler
Как в этом примере
new Handler(mBackgroundThread.getLooper());
Или вот еще один пример, в чем разница выполнения этих Hendler
new Handler().post(new Runnable() { @Override public void run() { //Execute some task } });
new Handler(getContext().getMainLooper()).post(new Runnable() { @Override public void run() { //Execute some task } });
При чем информации и примеров использования Looper как параметра очень мало и не понятно, толи из-за того, что это очень редко используется толи из-за того, что мало кто понимает как этим пользоваться...
Реализация Handler в Thread
class LooperThread extends Thread { public Handler mHandler;
public void run() { Looper.prepare();
mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } };
Looper.loop(); } }


Ответ

Looper - это что-то вроде фонового потока, который работает постоянно, не завершаясь. Чтобы передать в этот фоновый поток выполнение какой-либо операции, используется Handler
Если создавать Handler, не передавая в него Looper, то Looper возьмется из того потока, в котором вызывается конструктор Handler(), при условии, что этот родительский поток является HandlerThread.
Поток UI в Android является как раз таким потоком-лупером. Используя Handler, можно передавать в UI поток выполнение определенных операций вызовом метода post(Runnable). Естественно, не стоит надеяться, что тело метода run() выполнется в момент вызова метода post
В Вашем примере mBackgroundThread является наследником HandlerThread, следовательно имеет Looper
Разницы во втором Вашем блоке кода никакой нет, если оба конструктора Handler() вызываются из UI - потока.

Комментариев нет:

Отправить комментарий