Comunicação entre Threads no Android com Handler e Message

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.

Tags: android Handler Message threads Multithreading

Publicado em 6-8 06:25 por Thomas