Asynctask vs Thread no android


135

Na interface do usuário, para executar algum trabalho em segundo plano, usei um separado Thread. Mas, como sugerido por outros, agora estou usando AsyncTask.

Qual é a principal diferença entre a Threade an AsyncTask?

Em que cenário, devo usar um Threadou um AsyncTask?



@ webaldo.at Eu referi isso, aqui eles informaram entrar com descrição e diferença entre Asynctask e Thread.
Ram

Encurtado: Thread -> Sem acesso ao UI-Thread || AsyncTask -> Conditional acesso à UI-Thread
JavaDM

para tarefa em segundo plano IntentService é outra boa opção.
Chen

Respostas:


146

Para tarefas de longa execução ou com uso intenso de CPU, existem basicamente duas maneiras de fazer isso: encadeamentos Java e o AsyncTask nativo do Android.

Nenhum é necessariamente melhor que o outro, mas saber quando usar cada chamada é essencial para alavancar o desempenho do sistema em seu benefício.

Use AsyncTask para:

  1. Operações de rede simples que não exigem o download de muitos dados
  2. Tarefas ligadas ao disco que podem levar mais do que alguns milissegundos

Use encadeamentos Java para:

  1. Operações de rede que envolvem quantidades moderadas a grandes de dados (upload ou download)
  2. Tarefas de alta CPU que precisam ser executadas em segundo plano
  3. Qualquer tarefa em que você deseja controlar o uso da CPU em relação ao encadeamento da GUI

E há muitos bons recursos pela Internet que podem ajudá-lo:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


Posso perguntar por que a quantidade de dados de download é um problema?
Yeung

1
@Yeung Parece que você precisa de informações sobre a Tarefa assíncrona! Veja, quanto maior a quantidade de dados, maior o tempo necessário para concluir a mesma operação. Portanto, não é uma boa prática executar processos de execução longa usando a Tarefa assíncrona devido aos seguintes motivos: 1. A tarefa assíncrona está mal ligada ao ciclo de vida da atividade. 2. Eles criam vazamentos de memória.
Mohit

3
Dê uma olhada no seguinte: stackoverflow.com/questions/12797550/…
Mohit 1/02

Obrigado. Eu entendo o risco agora.
Yeung

@Impasse @Yeung A quantidade de dados IMO não é um problema, o principal problema com as operações de rede no momento da operação. Mesmo o download de alguns bytes pode demorar, quando o servidor está ocupado, inacessível (tempo limite) etc. Uma correção pode ser o uso AsyncTaskcom o próprio agendador.
xmedeko

44

Se você usar threads Java, precisará lidar com os seguintes requisitos em seu próprio código:

Sincronização com o thread principal se você postar novamente os resultados na interface do usuário

Não há padrão para cancelar o encadeamento

Nenhum pool de encadeamentos padrão

Não há padrão para lidar com alterações de configuração no Android


3
isso é realmente mais elucidativo porque aborda as razões pelas quais não se usa Threads simples. Do princípio, qualquer coisa que precise ser vinculada ao ciclo de vida Atividade / Serviço deve usar o AsyncTask, mesmo que você precise "degradar manualmente" manualmente os recursos dentro da tarefa, pelo menos você não acaba com a tarefa interrompida quando a atividade é interrompida.
LeRobot

28

Fio

  • Tarefa longa em geral
  • Chamar pelo método thread.start ()
  • Acionado a partir de qualquer thread
  • Executa em seu próprio encadeamento
  • O gerenciamento / código manual de threads pode se tornar difícil de ler

AsyncTask

  • Pequena tarefa que precisa se comunicar com o thread principal
  • Invocar pelo método excute ()
  • Acionado a partir do thread principal
  • Executa no segmento de trabalho
  • Deve ser executado e criado a partir do encadeamento principal

11

Fio

Um encadeamento é uma unidade de execução simultânea. Ele tem sua própria pilha de chamadas. Existem dois métodos para implementar threads em aplicativos.

Um está fornecendo uma nova classe que estende o Thread e substitui o método run (). O outro está fornecendo uma nova instância do Thread com um objeto Runnable durante sua criação. Um encadeamento pode ser executado chamando seu método "start". Você pode definir a "Prioridade" de um thread chamando seu método "setPriority (int)".

Um encadeamento pode ser usado se você não afetar a parte da interface do usuário. Por exemplo, você está chamando algum serviço da Web ou baixa alguns dados e, após o download, os exibe na tela. Então você precisa usar um Handler com um Thread e isso tornará seu aplicativo complicado para lidar com todas as respostas dos Threads.

Um manipulador permite enviar e processar objetos Message e Runnable associados ao MessageQueue de um thread. Cada encadeamento possui cada fila de mensagens. (Como uma lista de tarefas), e o thread pegará cada mensagem e a processará até que a fila de mensagens esteja vazia. Portanto, quando o manipulador se comunica, apenas envia uma mensagem para o segmento do chamador e aguarda o processamento.

Se você usar encadeamentos Java, precisará manipular os seguintes requisitos em seu próprio código:

Sincronização com o encadeamento principal se você postar de volta os resultados na interface do usuário Não há padrão para cancelar o encadeamento Não há pool de encadeamentos padrão Não há padrão para lidar com alterações de configuração no Android

AsyncTask

O AsyncTask permite o uso adequado e fácil do thread da interface do usuário. Essa classe permite executar operações em segundo plano e publicar resultados no thread da interface do usuário sem precisar manipular threads e / ou manipuladores. Uma tarefa assíncrona é definida por uma computação que é executada em um encadeamento em segundo plano e cujo resultado é publicado no encadeamento da interface do usuário.

O AsyncTask passará pelas quatro etapas a seguir:

onPreExecute ()

Chamado no thread da interface do usuário antes da tarefa ser executada

doInbackground (Params ..)

Chamado no segmento de plano de fundo imediatamente após onPreExecute () concluir a execução.

onProgressUpdate (Progress ..)

Chamado no thread da interface do usuário após uma chamada para publishProgress (Progress ...).

onPostExecute (Resultado)

Chamado no thread da interface do usuário após o término da computação em segundo plano.

Por que você deve usar o AsyncTask?

Fácil de usar para um thread de interface do usuário. (Portanto, use-o quando o thread do chamador for um thread da interface do usuário).

Não há necessidade de manipular manipuladores.

Para mais informações visite Aqui


2

Fio:

Threaddeve ser usado para separar operações de execução longa do encadeamento principal, para melhorar o desempenho. Mas não pode ser cancelado com elegância e não pode lidar com alterações de configuração do Android. Você não pode atualizar a interface do usuário de Thread.

AsyncTaskpode ser usado para lidar com itens de trabalho com duração inferior a 5 ms. Com AsyncTask, você pode atualizar a interface do usuário ao contrário do java Thread. Mas muitas tarefas de longa duração afetam o desempenho.

Você tem mais algumas alternativas para os dois.

HandlerThread / Handler e ThreadPoolExecutor

Consulte a publicação abaixo para obter mais detalhes:

Handler vs AsyncTask vs Thread

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.