Страницы

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

вторник, 31 декабря 2019 г.

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

#java #android


В офф документации очень коротко описано о том, что такое 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();
  }
}

    


Ответы

Ответ 1



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

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

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