Назад к вопросам
Middle
67
questionbank

Как можно получить сообщения на основном потоке с помощью Handler и Looper?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  1. Создать Handler: Связать его с Looper основного потока.
  2. Передать 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 на основном потоке.