É uma pergunta muito boa, um programador Android leva tempo para entender completamente o problema. Na verdade, AsyncTask tem dois problemas principais relacionados:
- Eles estão mal vinculados ao ciclo de vida da atividade
- Eles criam vazamentos de memória com muita facilidade.
Dentro do aplicativo RoboSpice Motivations ( disponível no Google Play ), respondemos a essa pergunta em detalhes. Ele dará uma visão aprofundada de AsyncTasks, Loaders, seus recursos e desvantagens e também apresentará uma solução alternativa para solicitações de rede: RoboSpice. As solicitações de rede são um requisito comum no Android e são, por natureza, operações de longa duração. Aqui está um trecho do aplicativo:
O ciclo de vida AsyncTask e Activity
AsyncTasks não seguem o ciclo de vida das instâncias de Activity. Se você iniciar uma AsyncTask dentro de uma Activity e girar o dispositivo, a Activity será destruída e uma nova instância será criada. Mas o AsyncTask não morrerá. Ele continuará vivendo até que seja concluído.
E quando for concluído, o AsyncTask não atualizará a IU da nova Activity. Na verdade, ele atualiza a instância anterior da atividade que não é mais exibida. Isso pode levar a uma Exceção do tipo java.lang.IllegalArgumentException: Visualização não anexada ao gerenciador de janelas se você usar, por exemplo, findViewById para recuperar uma visualização dentro da Atividade.
Problema de vazamento de memória
É muito conveniente criar AsyncTasks como classes internas de suas atividades. Como o AsyncTask precisará manipular as visualizações da Activity quando a tarefa for concluída ou em andamento, o uso de uma classe interna da Activity parece conveniente: as classes internas podem acessar diretamente qualquer campo da classe externa.
No entanto, isso significa que a classe interna manterá uma referência invisível em sua instância de classe externa: a Activity.
No longo prazo, isso produz um vazamento de memória: se a AsyncTask durar muito, ela manterá a atividade "viva", enquanto o Android gostaria de eliminá-la, pois não pode mais ser exibida. A atividade não pode ser coletada como lixo e esse é um mecanismo central para o Android preservar os recursos do dispositivo.
É realmente uma péssima ideia usar AsyncTasks para operações de longa duração. No entanto, eles são bons para aqueles de curta duração, como atualizar uma Visualização após 1 ou 2 segundos.
Eu encorajo você a baixar o aplicativo RoboSpice Motivations , ele realmente explica isso em profundidade e fornece exemplos e demonstrações das diferentes maneiras de fazer algumas operações em segundo plano.
doInBackground
função de longa duração congela a tela se uma barra de progresso não for usada.