Sobes.tech
Middle

Comment peut-on obtenir des messages sur le thread principal avec Handler et Looper?

sobes.tech IA

Réponse de l'IA

  1. Créer un Handler : Lier-le avec le Looper du thread principal.
  2. Envoyer un Runnable ou un Message : Via le Handler pour exécution sur le thread associé (dans ce cas, le principal).
// Sur le thread principal
val mainHandler = Handler(Looper.getMainLooper())

// Créer et envoyer un Runnable
mainHandler.post {
    // Code exécuté sur le thread principal
}

// Créer et envoyer un Message
val message = Message.obtain().apply {
    what = 1 // Identifiant arbitraire du message
    obj = "hello" // Données supplémentaires
}
mainHandler.sendMessage(message)
  • Looper.getMainLooper() obtient le Looper associé au thread principal.
  • Handler(Looper.getMainLooper()) crée un Handler qui traitera les messages envoyés à lui sur le thread principal.
  • post(Runnable) place le Runnable dans la file de messages du Looper pour exécution.
  • sendMessage(Message) envoie un message dans la file de messages du Looper.

Alternative : Classe Handler anonyme avec handleMessage

On peut redéfinir la méthode handleMessage dans une classe anonyme Handler pour traiter les messages.

// Sur le thread principal ou un autre thread où il faut créer un Handler pour le thread principal
val myHandler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        // Code exécuté sur le thread principal lors de la réception du message
        when (msg.what) {
            1 -> {
                val data = msg.obj as String
                // Traitement des données
            }
        }
    }
}

// Envoyer un message depuis un autre thread
Thread {
    val message = Message.obtain().apply {
        what = 1
        obj = "world"
    }
    myHandler.sendMessage(message)
}.start()

Dans ce cas, lors de la réception du message, la méthode handleMessage sera appelée sur le thread principal.