Handler, Looper, MessageQueue, Message — что такое, как работают?

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

Опубликовано

в

, ,

от

Метки: