Middle
Comment peut-on obtenir des messages sur le thread principal avec Handler et Looper?
sobes.tech IA
Réponse de l'IA
- Créer un
Handler: Lier-le avec leLooperdu thread principal. - Envoyer un
Runnableou unMessage: Via leHandlerpour 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 leLooperassocié au thread principal.Handler(Looper.getMainLooper())crée unHandlerqui traitera les messages envoyés à lui sur le thread principal.post(Runnable)place leRunnabledans la file de messages duLooperpour exécution.sendMessage(Message)envoie un message dans la file de messages duLooper.
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.