Handler
, Looper
, MessageQueue
, Message
— это основа внутренней работы UI-потока Android, и этот вопрос проверяет понимание асинхронности, очередей, многопоточности.
На сам вопрос довольно таки сложно ответить коротко. Это тема для большой статьи(-ей), которые есть на этом ресурсе. Здесь изложу вкратце.
Компонент | Назначение |
---|---|
Looper | Запускает цикл обработки сообщений (loop() ) |
MessageQueue | Хранит Message -и, которые ждут обработки |
Handler | Пишет и читает сообщения из очереди (post , send ) |
Message | Объект, содержащий задачу/данные для обработки |
Message
Обычный контейнер с типом сообщения или любой объект.
MessageQueue
- Хранит
Message
иRunnable
- Ожидает, пока придёт следующий message
- Устроена как время-ориентированная приоритетная очередь
Looper
- Один на поток (переменная
ThreadLocal<Looper>
) - Отвечает за
loop()
— бесконечный цикл обработки сообщений Looper.getMainLooper()
— главный (UI) поток
Handler
- Связан с конкретным
Looper
(то есть с конкретным потоком) - Позволяет:
- post’ить Runnable для выполнения в этом Looper’е
- отправлять сообщения (
Message
) - обрабатывать их (
handleMessage()
)
Аналогия
Хорошей аналогией для понимания, здесь может быть досмотр багажа в аэропорту.
Компонент | Аналог |
---|---|
MessageQueue | Очередь людей(с багажом и личными вещами) на досмотре |
Message | Один человек с багажом(Runnable) |
Looper | Лента куда кладут багаж и рентген-сканер |
Handler | Команда(или один) человек который подает пассажирам лотки(post()), куда они могут сложить свои вещи. А также проводят сканирование(handleMessage ()) багажа. |