Sobes.tech
Middle

Hoe kun je berichten krijgen op de hoofdthread met Handler en Looper?

sobes.tech AI

Antwoord van AI

  1. Maak een Handler: Koppel deze aan de Looper van de hoofdthread.
  2. Stuur een Runnable of Message: Via de Handler voor uitvoering op de bijbehorende thread (in dit geval, de hoofdthread).
// Op de hoofdthread
val mainHandler = Handler(Looper.getMainLooper())

// Maak en stuur een Runnable
mainHandler.post {
    // Code die op de hoofdthread wordt uitgevoerd
}

// Maak en stuur een Message
val message = Message.obtain().apply {
    what = 1 // Willekeurige bericht-ID
    obj = "hello" // Extra gegevens
}
mainHandler.sendMessage(message)
  • Looper.getMainLooper() krijgt de Looper die verbonden is met de hoofdthread.
  • Handler(Looper.getMainLooper()) maakt een Handler die berichten verwerkt die naar hem worden gestuurd op de hoofdthread.
  • post(Runnable) plaatst de Runnable in de berichtwachtrij van de Looper voor uitvoering.
  • sendMessage(Message) stuurt een bericht naar de berichtwachtrij van de Looper.

Alternatief: Anonieme Handler-klasse met handleMessage

Je kunt de methode handleMessage overschrijven in een anonieme Handler-klasse om berichten te verwerken.

// Op de hoofdthread of een andere thread waar je een Handler voor de hoofdthread wilt maken
val myHandler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        // Code die wordt uitgevoerd op de hoofdthread bij ontvangst van een bericht
        when (msg.what) {
            1 -> {
                val data = msg.obj as String
                // Verwerk gegevens
            }
        }
    }
}

// Verstuur een bericht vanaf een andere thread
Thread {
    val message = Message.obtain().apply {
        what = 1
        obj = "world"
    }
    myHandler.sendMessage(message)
}.start()

In dit geval wordt bij ontvangst van een bericht de handleMessage-methode op de hoofdthread aangeroepen.