Sobes.tech
Middle

Jak można uzyskać wiadomości na głównym wątku za pomocą Handler i Looper?

sobes.tech AI

Odpowiedź od AI

  1. Utwórz Handler: Połącz go z Looperem głównego wątku.
  2. Prześlij Runnable lub Message: Za pomocą Handler do wykonania na powiązanym wątku (w tym przypadku - głównym).
// W głównym wątku
val mainHandler = Handler(Looper.getMainLooper())

// Tworzenie i wysyłanie Runnable
mainHandler.post {
    // Kod wykonywany na głównym wątku
}

// Tworzenie i wysyłanie Message
val message = Message.obtain().apply {
    what = 1 // Dowolny identyfikator wiadomości
    obj = "hello" // Dodatkowe dane
}
mainHandler.sendMessage(message)
  • Looper.getMainLooper() pobiera Looper powiązany z głównym wątkiem.
  • Handler(Looper.getMainLooper()) tworzy Handler, który obsługuje wiadomości wysyłane do niego na głównym wątku.
  • post(Runnable) umieszcza Runnable w kolejce wiadomości Looper do wykonania.
  • sendMessage(Message) wysyła wiadomość do kolejki wiadomości Looper.

Alternatywa: Klasa anonimowa Handler z handleMessage

Możesz nadpisać metodę handleMessage w anonimowej klasie Handler, aby obsługiwać wiadomości.

// W głównym wątku lub innym wątku, gdzie trzeba utworzyć Handler dla głównego wątku
val myHandler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        // Kod wykonywany na głównym wątku po otrzymaniu wiadomości
        when (msg.what) {
            1 -> {
                val data = msg.obj as String
                // Przetwarzanie danych
            }
        }
    }
}

// Wysyłanie wiadomości z innego wątku
Thread {
    val message = Message.obtain().apply {
        what = 1
        obj = "world"
    }
    myHandler.sendMessage(message)
}.start()

W tym przypadku, po otrzymaniu wiadomości, wywoływana jest metoda handleMessage na głównym wątku.