Quais são as principais diferenças entre Handler, Thread e AsyncTask?

Thread

Um thread é uma linha de execução de código dentro de um aplicativo. Um aplicativo pode ter vários threads em execução num mesmo momento. Em outras palavras, threads permitem a um aplicativo ter comportamento multitarefa. No Java, a classe Thread é uma representação de um thread da Máquina Virtual Java ou JVM (que não necessariamente corresponde a um thread do sistema operacional hospedeiro, mas isso não vem ao caso).

Handlers e Threads

Para a diferença entre Handler e Thread, veja esta pergunta. Note que Handlers não são ThreadsHandlers têm esse nome porque servem para entregar mensagens (uma mensagem ou Message é basicamente o encapsulamento de um Runnable, isto é, um trecho de código executável) para threads que ficam em loop aguardando a chegada desses trechos de código para executar.

Para um thread ficar em loop, é preciso criar uma fila de mensagens para ele chamando os métodos Looper.prepare() e Looper.loop() dentro do próprio thread. No caso do thread principal o próprio sistema já faz esses passos, de forma que já o encontramos em loop por padrão.

Usamos um Handler quando queremos que um thread secundário execute muitas mensagens, ou quando queremos entregar uma mensagem ao thread principal. Neste último caso podemos evitar o uso do Handler através do método Activity.runOnUiThread() (caso estejamos em uma Activity), ou através de uma AsyncTask.

AsyncTasks

Uma AsyncTask é uma classe que permite executar três trechos de código em sequência: o primeiro será executado pelo thread principal (thread de UI), o segundo por um thread secundário, e o terceiro de novo pelo thread principal. Por debaixo dos planos isso é implementado usando Threads e Handlers.

AsyncTasks têm a intenção de simplificar a implementação dessa sequência de passos, que é muito comum de acontecer no Android (por exemplo: disparar uma animação de “carregando”, executar uma tarefa em segundo plano, e então interromper a animação).

Essa sequência é feita assim, separada em threads e não tudo no mesmo thread, porque o threadprincipal é reservado para atualizar a tela e não pode executar tarefas em segundo plano sob pena de perder a responsividade.

Escrito por piovezan

Deixe uma resposta