Sobes.tech
Middle

Como obter mensagens no thread principal usando Handler e Looper?

sobes.tech IA

Resposta da IA

  1. Criar um Handler: Associá-lo ao Looper do thread principal.
  2. Enviar um Runnable ou Message: Através do Handler para 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 o Looper associado ao thread principal.
  • Handler(Looper.getMainLooper()) cria um Handler que processará as mensagens enviadas a ele no thread principal.
  • post(Runnable) coloca o Runnable na fila de mensagens do Looper para execução.
  • sendMessage(Message) envia uma mensagem para a fila de mensagens do Looper.

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.