В офф документации очень коротко описано о том, что такое 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 - потока.
Комментариев нет:
Отправить комментарий