Estou confuso sobre quando alguém escolheria o AsyncTask em vez de um manipulador. Digamos que tenho algum código que desejo executar a cada n segundos que atualizará a interface do usuário. Por que eu escolheria um sobre o outro?
128
Respostas:
IMO, o AsyncTask foi criado para fornecer uma maneira conveniente e fácil de usar para obter o processamento em segundo plano em aplicativos Android, sem se preocupar muito com os detalhes de baixo nível (threads, loops de mensagens etc.). Ele fornece métodos de retorno de chamada que ajudam a agendar tarefas e também a atualizar facilmente a interface do usuário sempre que necessário.
No entanto, é importante observar que, ao usar o AsyncTask, um desenvolvedor está submetendo suas limitações, o que resultou devido às decisões de design que o autor da classe tomou. Por exemplo, descobri recentemente que há um limite para o número de trabalhos que podem ser agendados usando AsyncTasks.
O manipulador é mais transparente dos dois e provavelmente oferece mais liberdade; portanto, se você quiser ter mais controle sobre as coisas, escolha Handler, caso contrário, o AsynTask funcionará bem.
fonte
AsyncTasks
são executados em um thread, portanto, não há mais paralelismo. Você ainda pode executá-los em umaExecutor
implementação paralela .Minha regra geral seria:
Se você estiver fazendo algo isolado relacionado à interface do usuário, por exemplo, baixar dados para apresentar em uma lista, vá em frente e use
AsyncTask
.Se você estiver executando várias tarefas repetidas, por exemplo, o download de várias imagens que serão exibidas
ImageViews
(como o download de miniaturas) durante o download, use uma fila de tarefas comHandler
.fonte
Sempre tente evitar o uso do AsyncTask quando possível, principalmente pelos seguintes motivos:
Não é garantido que o AsyncTask seja executado, pois há uma base ThreadPool e um tamanho máximo definidos pelo sistema e, se você criar um assíncrono em excesso, eles serão destruídos.
O AsyncTask pode ser encerrado automaticamente, mesmo durante a execução, dependendo do ciclo de vida da atividade e você não tem controle sobre ele
Os métodos AsyncTask em execução no thread da interface do usuário, como onPostExecute, podem ser executados quando a atividade a que se refere, não está mais visível ou está possivelmente em um estado de layout diferente, como após uma mudança de orientação.
Concluindo, você não deve usar os métodos vinculados ao UIThread do AsyncTask, que é sua principal vantagem !!! Além disso, você só deve realizar trabalhos não críticos no doInBackground. Leia este tópico para obter mais informações sobre esses problemas:
O AsyncTask é realmente conceitualmente defeituoso ou estou perdendo alguma coisa?
Para concluir, tente preferir usar IntentServices, HandlerThread ou ThreadPoolExecutor em vez de AsyncTask quando qualquer um dos problemas citados acima puder ser uma preocupação para você. Certamente, será necessário mais trabalho, mas seu aplicativo será mais seguro.
fonte
Se você deseja fazer um cálculo a cada x segundos, provavelmente deve agendar um
Runnable
em umHandler
(compostDelayed()
) e issoRunnable
deve começar no segmento atual da interface do usuário. Se você deseja iniciá-lo em outro segmento, use HandlerThread. O AsyncTask é mais fácil de usar, mas não é melhor que o manipulador.fonte
O manipulador está associado ao encadeamento principal do aplicativo. ele lida e agenda mensagens e executáveis enviados de threads em segundo plano para o thread principal do aplicativo.
O AsyncTask fornece um método simples para lidar com threads em segundo plano, a fim de atualizar a interface do usuário sem bloqueá-la por operações demoradas.
A resposta é que ambos podem ser usados para atualizar a interface do usuário a partir de threads em segundo plano, a diferença estaria no seu cenário de execução. Você pode considerar usar o manipulador para enviar mensagens atrasadas ou enviar mensagens para o MessageQueue em uma ordem específica.
Você pode usar o AsyncTask se desejar trocar parâmetros (atualizando a interface do usuário) entre o thread principal do aplicativo e o thread de segundo plano de uma maneira fácil e conveniente.
fonte
AsyncTask
presume que você fará algo no thread da interface do usuário, após a conclusão de algum trabalho em segundo plano. Além disso, você pode executá-lo apenas uma vez (depois disso, seu status éFINISHED
e você receberá uma exceção ao tentar executá-lo mais uma vez). Além disso, a flexibilidade de usá-lo não é muito. Sim, você pode usarTHREAD_POOL_EXECUTOR
para uma execução paralela, mas o esforço pode não ser digno.Handler
não presume nada, exceto manipular Runnables e Mensagens. Além disso, ele pode ser executado quantas vezes você desejar . Você é livre para decidir a qual thread ele deve ser anexado, como ele se comunica com outros manipuladores, talvez produzi-losHandlerThread
. Portanto, é muito mais flexível e adequado para trabalhos repetidos.Confira diferentes tipos de
Handler
exemplos aqui .fonte
Eles são a melhor pergunta de entrevista que é feita. AsyncTask - Eles são usados para descarregar o thread da interface do usuário e executar tarefas em segundo plano. Manipuladores - o dosent Android possui um meio direto de comunicação entre a interface do usuário e o thread de segundo plano. Os manipuladores devem ser usados para enviar mensagens ou executáveis pela fila de mensagens.
Portanto, AsyncTasks são usadas onde as tarefas são necessárias para serem executadas em segundo plano e os Manipuladores são usados para comunicação entre uma interface do usuário e o Thread de segundo plano.
fonte
doInBackground - basicamente funciona em outro segmento. onPostExecute - lança os resultados no thread da interface do usuário e está enviando internamente uma mensagem para o manipulador do thread principal. O thread principal da interface do usuário já possui um looper e um manipulador associados.
Então, basicamente, se você precisar executar alguma tarefa em segundo plano, use o AsyncTask. Mas, em última análise, se algo precisar ser atualizado na interface do usuário, ele estará usando o manipulador do thread principal.
fonte