Когда обработчик связан с петлителем? - PullRequest
0 голосов
/ 23 сентября 2019

Кажется, что просто вызов new Handler () связывает обработчик с петлителем текущего потока без каких-либо специфических для потока аргументов, передаваемых в конструктор.

  1. Как он определяет, что является текущим потокомХотя?
  2. Почему вызов нового Handler () в определенных методах (onLooperPrepared (), onCreate ()) обязателен?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Как он определяет текущий поток?

Если вы погрузитесь в вызов new Handler(), вы увидите исходный код, я покажу вам:

enter image description here

Красный прямоугольник показывает, что вам нужно Looper, когда вы new Handler.

Дело mLooper==null происходит только тогда, когда вы вызываете new Handler не в потоке пользовательского интерфейса, или вы не вызываете Looper.prepare() в своем рабочем потоке.

Кроме того, вы можете связать обработчик с петлителем текущего потока,см. Определение обработчика в потоке пользовательского интерфейса , например handler = new Handler(Looper.getMainLooper()).

0 голосов
/ 23 сентября 2019

Как он определяет текущий поток?

Вызывая Thread.currentThread() статический метод

Почему вызывается новый обработчик ()в определенных методах (onLooperPrepared (), onCreate ()) обязательно?

Это на самом деле не обязательно в зависимости от задачи, которую вы хотите, чтобы ваш обработчик делал.
Но в целом Looper требуется для обработчикаобрабатывать сообщения.

Подробнее: Как использовать Thread, Looper и Handler в Android

...