Назад к вопросам
Middle
67
questionbank
Как можно получить сообщения на основном потоке с помощью Handler и Looper?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
- Создать
Handler: Связать его сLooperосновного потока. - Передать
RunnableилиMessage: Отправить их черезHandlerдля выполнения на связанном потоке (в данном случае - основном).
// В основном потоке
val mainHandler = Handler(Looper.getMainLooper())
// Создание и отправка Runnable
mainHandler.post {
// Код, выполняемый на основном потоке
}
// Создание и отправка Message
val message = Message.obtain().apply {
what = 1 // Произвольный идентификатор сообщения
obj = "hello" // Дополнительные данные
}
mainHandler.sendMessage(message)
Looper.getMainLooper()получаетLooper, связанный с основным потоком.Handler(Looper.getMainLooper())создаетHandler, который будет обрабатывать сообщения, отправленные ему, на основном потоке.post(Runnable)ставитRunnableв очередь сообщенийLooperдля выполнения.sendMessage(Message)отправляет сообщение в очередь сообщенийLooper.
Альтернатива: Анонимный класс Handler c handleMessage
Можно переопределить метод handleMessage в анонимном классе Handler для обработки сообщений.
// В основном потоке или другом потоке, где нужно создать Handler для основного потока
val myHandler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
// Код, выполняемый на основном потоке при получении сообщения
when (msg.what) {
1 -> {
val data = msg.obj as String
// Обработка данных
}
}
}
}
// Отправка сообщения с другого потока
Thread {
val message = Message.obtain().apply {
what = 1
obj = "world"
}
myHandler.sendMessage(message)
}.start()
В этом случае, при получении сообщения, будет вызван метод handleMessage на основном потоке.