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()) багажа. |