Diferença entre serviço, tarefa assíncrona e thread?

147

Qual é a diferença entre Serviço, Tarefa assíncrona e thread. Se não estou errado, todos eles são usados ​​para fazer algumas coisas em segundo plano. Então, como decidir qual usar e quando?

SpunkerBaba
fonte
Parece que há mais uma coisa com a qual as pessoas podem se confundir com frequência - Carregadores . Tópico relacionado - Asynctask vs Thread vs Services vs Loader
RBT

Respostas:

186

Provavelmente você já leu a descrição da documentação sobre eles, não vou repeti-los. Em vez disso, tentarei responder com minhas próprias palavras, espero que eles o ajudem.

  • O serviço é como uma atividade, mas não possui interface com o usuário. Provavelmente, se você quiser buscar o clima, por exemplo, não criará uma atividade em branco para isso; por isso, usará um Serviço.

  • Um Thread é um Thread, provavelmente você já o conhece de outra parte. Você precisa saber que não pode atualizar a interface do usuário a partir de um thread. Você precisa usar um manipulador para isso, mas leia mais.

  • Um AsyncTask é um encadeamento inteligente recomendado para uso. Inteligente, pois pode ajudar com seus métodos, e existem três métodos que são executados no thread da interface do usuário, o que é bom para atualizar os componentes da interface do usuário.

Estou usando Serviços, AsyncTasks frequentemente. Thread menos, ou não, como eu posso fazer quase tudo com AsyncTask.

Pentium10
fonte
1
Obrigado pela sua explicação. Então, se eu precisar criar um aplicativo que busque dados da Web, qual seria a melhor opção de serviço ou tarefa assíncrona?
SpunkerBaba
16
Você precisa usar os dois. Você cria um serviço e dentro dele usa o AsyncTask.
Pentium10
4
Para adicionar a resposta acima, o AsyncTask realiza 4 etapas: onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Result), {executando no thread da interface do usuário}, doInBackground (Params ...) {executando no thread de segundo plano}. Como ele fornece três métodos no encadeamento da interface do usuário, o usuário não precisa se preocupar em usar manipuladores ou retornos de chamada para atualizar a interface do usuário.
SpunkerBaba
11
@ Pentium10: em vez de Service + AsyncTask, muitas vezes você pode usar um IntentService
njzk2
11
Também digno de nota é que, por padrão, os serviços Android são executados no thread principal (UI). Se o seu serviço precisar trabalhar em segundo plano, ele deverá ser iniciado em um thread separado (ou AsyncTask) explicitamente. Caso contrário, pode correr o risco de interromper a capacidade de resposta da interface do usuário e gerar erros do aplicativo não está respondendo. Um serviço em que o Android é essencialmente uma atividade "invisível" e "em miniatura", NÃO necessariamente um trabalhador "em segundo plano".
CCJ
23

Esta é a resposta mais fácil para sua pergunta

Fio

é uma unidade de execução que executa "paralelamente" ao Thread principal é um ponto importante, não é possível atualizar um componente da interface do usuário a partir de qualquer thread aqui, exceto o thread principal.

AsyncTask

é um encadeamento especial, que fornece métodos auxiliares para atualizar a interface do usuário; portanto, você pode atualizar a interface do usuário, mesmo que o AsyncTask seja executado em um encadeamento em segundo plano. A manipulação de comunicação entre processos não precisa ser feita explicitamente.

Serviço

resolva o problema acima porque ele vive separado da atividade que a invoca, para poder continuar em execução mesmo quando a atividade é destruída; ela é executada no Thread Principal (cuidado com o ANR) usa um serviço em segundo plano (estenda IntentService, crie automaticamente o thread de trabalho para você) . O serviço é como uma atividade sem interface do usuário , é bom para tarefas longas

Alejandro Serret
fonte
4
O AyncTask não seria recriado ao girar o dispositivo, pois não está sincronizado com os métodos do ciclo de vida da atividade.
CopsOnRoad
4
você cria o AsyncTask em um gancho do ciclo de vida da atividade e quando você gira o telefone, a atividade é destruída e reiniciada. A instância anterior do AsyncTask está conectada à atividade que você acabou de destruir e, por esse motivo, receberá um "Force Close", mas também verá como uma nova instância do AsynTask é acionada novamente. Você pode usar fragmentos para reter o AsyncTask e definir setRetainInstance (true) no fragmento que o ajudará.
Alejandro Serret 12/09
15

Mais algumas informações que eu gostaria que alguém tivesse me contado há alguns dias:

  • Você pode compartilhar variáveis ​​globais - como threads - entre Atividades e Serviços.
  • Seu aplicativo, juntamente com todas as suas variáveis ​​globais, não será eliminado enquanto houver uma Atividade ou um Serviço ainda presente.
  • Se você tiver uma instância de um Serviço em seu aplicativo e o sistema operacional precisar de recursos, ele primeiro matará suas atividades, mas enquanto houver o serviço, o sistema operacional não eliminará seu aplicativo junto com suas variáveis ​​globais.

Meu caso de uso é o seguinte: tenho um encadeamento no espaço global conectado a um servidor e uma atividade que mostra os resultados. Quando o usuário pressiona o botão home, a Atividade fica em segundo plano e um novo Serviço é iniciado. Este serviço lê os resultados do encadeamento e exibe informações na área de notificação quando necessário. Não me preocupo com o SO que destrói minha Atividade, porque sei que, enquanto o Serviço estiver em execução, ele destruirá o encadeamento.

Peter Jankuliak
fonte
9

Em resumo, o Service for time consuming tasks, AsyncTask for short-lived tasks, Thread é um standard java constructionpara threads.

Abbath
fonte
3

Da perspectiva do desenvolvedor:

Thread : Usado para executar o conjunto de códigos paralelamente ao thread principal. Mas você não pode manipular a interface do usuário dentro do thread. Para isso você precisa usar Handler. Hadler funciona como um thread, mas também pode lidar com a interface do usuário.

ASyncTask : Usado para lidar com as tarefas que você não pode executar para trabalhar no thread principal. Por exemplo, uma solicitação HTTP é um trabalho muito pesado que não pode ser manipulado no encadeamento principal; portanto, você lida com a solicitação HTTP no modo ASyncTaskFunciona paralelamente ao seu encadeamento principal de forma assíncrona em segundo plano. eventos.

Serviço : é um processo em segundo plano. É empregado quando você precisa executar algum processamento que não possui nenhuma interface de usuário associada.

Rahul Raina
fonte
1
Servicenão será necessário executar em segundo plano, a menos que você use IntentService. Se você iniciou um padrão Serviceno UiThread, ele será executado no UiThread.
precisa saber é
@yshahak Você está correto, mas aqui não precisamos de uma definição profunda. O usuário só quer saber a diferença entre eles.
Rahul Raina
Sim, mas isso não é exato, pois Servicenão será executado em um processo diferente por padrão, mas no processo do aplicativo com os outros componentes. Melhor dizer que Serviceserá executado no plano de fundo do segmento em que ele vive.
precisa saber é
Todos os três trabalhos acima estão dentro do processo de inscrição. Os métodos preExecute () e postExecute () do ASyncTask funcionam em UIThread e doInBackground () & onProgress () funcionam no thread de segundo plano. O serviço funciona no thread de segundo plano e o Thread também funciona no thread de segundo plano. No entanto, o manipulador funciona no thread da interface do usuário.
Rahul Raina
2

serviço é como atividade tarefa demorada, mas a tarefa assíncrona nos permite realizar operações longas / em segundo plano e mostrar seu resultado no thread da interface do usuário sem ter que manipular threads.

pankaj
fonte