Middle
Como obter mensagens no thread principal usando Handler e Looper?
sobes.tech IA
Resposta da IA
- Criar um
Handler: Associá-lo aoLooperdo thread principal. - Enviar um
RunnableouMessage: Através doHandlerpara execução no thread associado (neste caso, o principal).
// No thread principal
val mainHandler = Handler(Looper.getMainLooper())
// Criar e enviar um Runnable
mainHandler.post {
// Código a ser executado no thread principal
}
// Criar e enviar uma Message
val message = Message.obtain().apply {
what = 1 // Identificador arbitrário da mensagem
obj = "hello" // Dados adicionais
}
mainHandler.sendMessage(message)
Looper.getMainLooper()obtém oLooperassociado ao thread principal.Handler(Looper.getMainLooper())cria umHandlerque processará as mensagens enviadas a ele no thread principal.post(Runnable)coloca oRunnablena fila de mensagens doLooperpara execução.sendMessage(Message)envia uma mensagem para a fila de mensagens doLooper.
Alternativa: Classe anônima Handler com handleMessage
Pode-se sobrescrever o método handleMessage numa classe anónima Handler para processar mensagens.
// No thread principal ou noutro thread onde seja necessário criar um Handler para o thread principal
val myHandler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
// Código a ser executado no thread principal ao receber uma mensagem
when (msg.what) {
1 -> {
val data = msg.obj as String
// Processar dados
}
}
}
}
// Enviar mensagem de outro thread
Thread {
val message = Message.obtain().apply {
what = 1
obj = "world"
}
myHandler.sendMessage(message)
}.start()
Neste caso, ao receber uma mensagem, será chamado o método handleMessage no thread principal.