Sobes.tech
Middle

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

sobes.tech AI

Отговор от 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 с 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 в основния поток.