Como os Handlers funcionam no Android? |
Por G.S. Jackson Atualizado em 17 abril, 2017 Traduzido por Allisson Ester de Paiva
A programação Java para Android funciona através de um conceito de transmissão de mensagem, no qual threads de execução de um programa transmitem mensagens de um código executável para outro, de modo a cumprir tarefas específicas ou manter a comunicação entre diferentes partes do aplicativo. A classe "Handler", junto com a classe "MessageQueue", organiza, executa, e despacha mensagens e objetos executáveis através de código. Cada thread no programa Android pode ter uma classe "Handler" para gerenciar dados e mensagens.
A classe "Runnable" do Android
A classe "Runnable" representa uma interface para a classe thread. As classes podem implementar a "Runnable" de modo que programas possam executar pedidos dela como threads executáveis. Usar a interface "Runnable" significa que uma classe pode rodar ao mesmo tempo que outras classes, permitindo que múltiplos pedidos de execução possam ocorrer ao mesmo tempo. Programas Android, através dos "Handlers", podem transmitir objetos executáveis como mensagens.
Classe "Message"
Esta classe facilita a transmissão de dados dentro do código Android. Um objeto "Message" contém um objeto de dados arbitrário que pode ser transmitido adiante para um "Handler", com uma informação definida por programação, com relação a natureza dos dados dentro do objeto. Objetos "Message" também contêm métodos para se obter dados de outras fontes, funcionando como um tipo de meio "transmissor" pelo qual dados e metadados possam ser passados entre programas e objetos "Handler".
Classes "Looper" e "Android MessageQueue"
Essas classes servem como interfaces para o processamento de mensagens e dados dentro de uma thread de execução. Além disso, elas levam mensagens despachadas para uma thread única de execução. Estas mensagens são representadas por objetos da classe "Message". A classe "MessageQueue" possui uma lista desses objetos "Message", enquanto a classe "Looper" círcula através delas para processar a atual thread de execução.
Um objeto "Handler" permite ao programador enviar e recuperar mensagens e objetos executáveis das "MessageQueues" associados com a thread de execução. Objetos "Message" de outras threads, ou threads "Runnable" enviadas a atual thread de execução, são enviados ao "Handler" através da "MessagQueue", e executados pelo "Handler". Qualquer mensagem passará através dos objetos "Handler" em seu caminho para a "MessageQueue". Cada thread de execução em um programa terá um "Handler" associado a ela, junto com uma "MessageQueue" única.
Como o "Handler" funciona
O pedido "Handler" em uma thread receberá objetos "Message" e "Runnable" através da "MessageQueue". Métodos são então invocados pelo programador para gerenciar objetos específicos. Por exemplo, o método "Post" toma os objetos "Runnable" e os coloca na "MessageQueue". De modo similar, os métodos "SendMessage" fazem o mesmo com objetos "Message". Variações desses métodos especificam quando uma "MessageQueue" de um "Handler" processa objetos "Runnable" ou "Message".