← Назад к вопросам
Как 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
}
}
Жизненный цикл сообщения
- Создание:
Handler.post(runnable)илиsendMessage(message) - Добавление в очередь: сообщение попадает в MessageQueue
- Ожидание: Looper ждёт, пока сообщение не придёт в очередь
- Извлечение:
Looper.next()получает сообщение из очереди - Отправка:
message.target.dispatchMessage()(target = Handler) - Обработка: вызывается
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.