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?
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?
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.
AsyncTaskssão executados em um thread, portanto, não há mais paralelismo. Você ainda pode executá-los em uma Executorimplementaçã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 com Handler.
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.
Se você deseja fazer um cálculo a cada x segundos, provavelmente deve agendar um Runnableem um Handler(com postDelayed()) e isso Runnabledeve 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.
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.
AsyncTaskpresume 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 é FINISHEDe 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 usar THREAD_POOL_EXECUTORpara uma execução paralela, mas o esforço pode não ser digno.
Handlernã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-los HandlerThread. Portanto, é muito mais flexível e adequado para trabalhos repetidos.
Confira diferentes tipos de Handlerexemplos aqui .
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.
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.