terça-feira, 18 de agosto de 2015

Android básico: a classe Handler

  A classe Handler é extensamente utilizada nas aplicações Android, nem precisa lembrar que entender e saber utilizá-la é fundamental.

Segue uma tradução livre da documentação do Android:

"A classe Handler permite que você envie e processe mensagens (Messages) e objetos executáveis (Runnables) associados  com a fila de mensagens (MessageQueue) da thread. Cada instância do Handler está associada a uma única thread e à sua fila de mensagens. Quando você cria um novo Handler, ele é associado à fila de mensagens da thread onde está sendo instanciado  - a partir desse ponto, ele vai enviar mensagens e Runnables para a fila de mensagens e executá-los quando eles forem retirados da fila de mensagens.

  Existem dois principais usos para um Handler: (1) para agendar mensagens e runnables para serem executados em algum momento no futuro; e (2) para enfileirar uma ação a ser executada em uma thread diferente da thread em execução.

  O agendamento de mensagens é realizado com os métodos post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), e sendMessageDelayed(Message, long). As versões "post" permitem que você enfileire objetos executáveis a serem chamados pela fila de mensagens em que eles são recebidos; as versões "sendMessage" permitem que você enfileire um objeto Message contendo um conjunto de dados que serão processados ​​pelo método handleMessage(Message) do Handler (o que exige que você implemente uma subclasse do Handler).

  Ao usar "post" ou "send"  para um Handler, você pode permitir que o item possa ser processado assim que a fila de mensagens esteja pronto para fazê-lo, ou especifique um atraso antes que seja processado ou horário específico para que possa ser processado. As duas últimas opções permitem implementar timeouts, ticks, e outros comportamentos baseados em tempo.

  Quando um processo é criado para a sua aplicação, sua thread principal é dedicada à execução de uma fila de mensagens que cuida da gestão dos objetos de nível superior da aplicação (activities, broadcast receivers, etc.) e quaisquer janelas que criarem. Você pode criar suas próprias threads, e comunicar com a main-thread do aplicativo através de um objeto Handler. Isso é feito chamando o mesmo método "post" ou "sendMessage" como antes, mas a partir de sua nova thread. O Runnable ou Message então será agendado na fila de mensagens do Handler e processados ​​quando apropriado."