O uso do Handler no Android é essencail para gerenciar a comunicação entre threads, especialmente quando é necessário transferir dados de uma thread de trabalho para a thread principal para atualizar a interface do usuário. Neste artigo, vamos demonstrar técnicas avançadas para enviar dados de threads secundárias usando Message e Handler, incluindo o envio de tipos primitivos e objetos personalizados.
Primeiramente, considere enviar dados inteiros de uma thread secundária. O código abaixo cria uma thread que dorme por um período e então envia uma mensagem com campos inteiros através do Handler:
Thread threadTrabalho = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1500); // Atraso simulado
} catch (InterruptedException e) {
e.printStackTrace();
}
Message mensagem = new Message();
mensagem.arg1 = 50;
mensagem.arg2 = 100;
mensagem.what = 1;
handlerPrincipal.sendMessage(mensagem);
}
});
threadTrabalho.start();
No lado do processamento, o Handler na thread principal recebe e trata a mensagem. Note que o valor de what é usado para identificar o tipo de mensagem:
private Handler handlerPrincipal = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
textVisualizacao.setText("Dados recebidos: " + msg.arg1 + " e " + msg.arg2);
} else if (msg.what == 2) {
PerfilUsuario usuario = (PerfilUsuario) msg.obj;
textVisualizacao.setText("Nome: " + usuario.getNome() + ", Idade: " + usuario.getIdade());
}
}
};
Para enviar objetos complexos, utilize a propriedade obj da Message. Primeiro, defina uma classe de modelo, como PerfilUsuario:
public class PerfilUsuario {
private String nome;
private int idade;
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public int getIdade() { return idade; }
public void setIdade(int idade) { this.idade = idade; }
}
Em seguida, modifique a thread para enviar uma instância dessa classe:
Thread threadDados = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
PerfilUsuario usuario = new PerfilUsuario();
usuario.setNome("Maria");
usuario.setIdade(28);
Message mensagem = new Message();
mensagem.what = 2;
mensagem.obj = usuario;
handlerPrincipal.sendMessage(mensagem);
}
});
threadDados.start();
Essa abordagem permite a integração eficiente de operações assíncronas com atualizações de interface, mantendo a responsividade do aplicativo Android.