← Назад к вопросам

Как Handler и Looper взаимодействуют друг с другом

2.3 Middle🔥 121 комментариев
#JVM и память#Многопоточность и асинхронность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Handler и Looper: архитектура обработки сообщений

Архитектура взаимодействия

Handler и Looper работают вместе в модели Producer-Consumer. Это фундаментальный механизм Android для синхронизации и обработки сообщений между потоками.

Handler (Producer)  ──sendMessage()──>  MessageQueue
                                            |
                                            v
                                        Looper (Consumer)
                                      (бесконечный цикл)
                                            |
                                      handleMessage()

Роли компонентов

Looper — бесконечный цикл:

  • Владеет MessageQueue — очередью сообщений
  • Постоянно вызывает MessageQueue.next() для получения сообщений
  • Отправляет полученное сообщение обработчику (Handler)
  • Работает в отдельном потоке (обычно Main Thread)
// Упрощённое представление Looper
loop {
    val message = messageQueue.next() // Ждёт сообщение
    message.target.dispatchMessage(message) // Обрабатывает
}

Handler — отправитель и получатель:

  • Связан с конкретным Looper и его MessageQueue
  • Отправляет сообщения в очередь (post(), sendMessage())
  • Обрабатывает сообщения в методе handleMessage()
  • Может отправлять задержанные сообщения (postDelayed())
class MyHandler(looper: Looper) : Handler(looper) {
    override fun handleMessage(msg: Message) {
        // Обработка в потоке Looper
    }
}

Жизненный цикл сообщения

  1. Создание: Handler.post(runnable) или sendMessage(message)
  2. Добавление в очередь: сообщение попадает в MessageQueue
  3. Ожидание: Looper ждёт, пока сообщение не придёт в очередь
  4. Извлечение: Looper.next() получает сообщение из очереди
  5. Отправка: message.target.dispatchMessage() (target = Handler)
  6. Обработка: вызывается Handler.handleMessage()

Пример взаимодействия

// Main Thread имеет свой Looper
val mainHandler = Handler(Looper.getMainLooper()) {
    // Код выполнится в Main Thread
    textView.text = "Updated"
}

// Background работа
Thread {
    val data = loadData() // Долгая операция
    mainHandler.post {
        // Обновление UI в Main Thread
        updateUI(data)
    }
}.start()

Main Thread Looper

android.app.ActivityThread создаёт Looper для Main Thread:

// В android.app.ActivityThread.main()
Looper.prepareMainLooper()
Looper.loop() // Бесконечный цикл

Это Looper обрабатывает все события Activity, нажатия кнопок, сигналы от системы.

Потокобезопасность

  • Handler потокобезопасен — его методы можно вызывать из любого потока
  • MessageQueue потокобезопасна — использует внутреннюю синхронизацию
  • handleMessage() выполняется в потоке Looper — гарантированно в нужном потоке

Современные альтернативы

  • Coroutines с Dispatchers.Main — более удобны и мощны
  • LiveData — автоматическое переключение потоков
  • RxJava — реактивный подход

Однако Handler и Looper остаются фундаментом этих механизмов.

Выводы

Handler и Looper формируют систему обработки сообщений, которая позволяет безопасно выполнять код в определённом потоке. Это старый, но надёжный механизм, который лежит в основе многих высокоуровневых абстракций Android.