Когда обработчик связан с лупером?

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

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

person ryannmahajan    schedule 23.09.2019    source источник


Ответы (2)


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

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

введите здесь описание изображения

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

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

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

person Robbit    schedule 23.09.2019

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

Вызовом метода Thread.currentThread()static

Почему вызов new Handler() в определенных методах (onLooperPrepared(), onCreate()) обязателен?

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

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

person Vladyslav Matviienko    schedule 23.09.2019
comment
ссылка 404 - person Robbit; 23.09.2019
comment
@Robbit не уверен, почему, возможно, это динамическая ссылка. Я исправил его, но, вероятно, он снова станет недействительным. проверю завтра - person Vladyslav Matviienko; 23.09.2019