Android: AsyncTask vs Service


138

Por que leio muito a resposta para a maioria das perguntas aqui AsyncTaske sobre Loaders, mas nada sobre Serviços ? Os Serviços simplesmente não são conhecidos muito bem ou estão obsoletos ou têm alguns atributos ruins ou algo assim? Quais são as diferenças?

(A propósito, eu sei que existem outros tópicos sobre isso, mas nenhum realmente indica diferenças claras que ajudam um desenvolvedor a decidir facilmente se ele está melhor usando um ou outro para um problema real.)

Respostas:


272

Em alguns casos, é possível realizar a mesma tarefa com um AsyncTaskou outro, Servicemas geralmente um é mais adequado para uma tarefa que o outro.

AsyncTasks são projetados para tarefas demoradas que não podem ser executadas no thread da interface do usuário. Um exemplo comum é buscar / processar dados quando um botão é pressionado.

Services são projetados para serem executados continuamente em segundo plano. No exemplo acima de buscar dados quando um botão é pressionado, você pode iniciar um serviço, deixá-lo buscar os dados e interrompê-lo, mas isso é ineficiente. É muito mais rápido usar um AsyncTaskque será executado uma vez, retornará os dados e estará pronto.

Se você precisar fazer algo continuamente em segundo plano, a Serviceé a sua melhor aposta. Exemplos disso incluem reprodução de música, verificação contínua de novos dados etc.

Além disso, como Sherif já disse, os serviços não são necessariamente executados no thread da interface do usuário.

Na maior parte, Services são para quando você deseja executar o código, mesmo quando o aplicativo Activitynão está aberto. AsyncTasks são projetados para tornar a execução de código fora do thread da interface do usuário incrivelmente simples.


2
É interessante que nesta palestra do Google I / O em 2010 youtube.com/watch?v=xHXn3Kg2IQE, o apresentador forneça três métodos diferentes para obter dados de uma API REST e o primeiro use um serviço. Eu não sou um especialista em Android, mas também tive a impressão de que o que Computerish disse está basicamente correto.
Wuliwong 30/09/12

10
O último parágrafo, "Serviços são para quando você deseja executar código, mesmo quando a Atividade do seu aplicativo não está aberta". Esse também é o caso do AsyncTask ou dos threads de segundo plano. ou seja, quando você pressiona novamente a sua atividade ou chama a conclusão () e sua atividade não é visível, mas os threads de segundo plano ainda estão em execução até você interromper o processo do aplicativo (por exemplo, trocando de tarefas recentes). Eu verifiquei isso com a garra do Google Nexus AOSP 4.4.2
Shirish Herwade

10
No entanto, o AsyncTask pode ser complicado se a atividade que o iniciou for interrompida enquanto o AsyncTask ainda estiver em execução e precisar atualizar a interface do usuário assim que terminar ... (o que não funcionará porque a atividade já foi destruída). Por que não usar um IntentService que você não precisa parar manualmente, pois ele simplesmente termina uma vez feito?
AgentKnopf 15/09

bons pontos. boa explicação sobre o serviço. Esse é o serviço executado em segundo plano continuamente, até o trabalho é feito.
BABU K

3
@LarsH Corrija-me se estiver errado, mas acho que você poderia usar um BroadcastReceiver em sua Atividade / Fragmento e, no IntentService, você simplesmente dispara um Broadcast quando terminar. Como você pode se registrar novamente para Broadcasts após a recriação de Atividade / Fragmento que você deve cobrir. Outra alternativa seria usar um EventBus para atualizar a interface do usuário (embora eu tente evitar isso - torne o código mais difícil de seguir).
precisa saber é o seguinte

58

Os serviços são completamente diferentes: serviços não são threads !

Sua atividade se liga a um serviço e o serviço contém algumas funções que, quando chamadas, bloqueiam o encadeamento de chamada. Seu serviço pode ser usado para alterar a temperatura de Celsius para Graus. Qualquer atividade que se liga pode obter esse serviço.


No entanto, AsyncTaské um segmento que realiza algum trabalho em segundo plano e, ao mesmo tempo, tem a capacidade de relatar resultados de volta ao segmento de chamada.

Apenas um pensamento: um serviço pode ter um AsyncTaskobjeto!


2
Os serviços são descritos como executados em segundo plano, continuando mesmo quando o aplicativo é fechado. O AsyncTask também é usado para fazer algo em segundo plano. Sabe o que eu quero dizer?
precisa saber é o seguinte

1
sim, mas os serviços podem ou não estar fazendo algo. Eles são um OBJETO duradouro
Sherif elKhatib

"Um serviço pode ter um objeto AsyncTask!" Obrigado por apontar isso. Mas é uma boa ideia - é algo que você recomendaria? Ou seria melhor usar técnicas mais básicas de encadeamento em um serviço?
RenniePet

"Sua atividade se liga a um serviço" não necessariamente.
precisa saber é o seguinte

@ JacksOnF1re Eu sei que é assim que comecei a codificar: p mas "Sua atividade se liga a um serviço" é uma afirmação verdadeira. Eu também poderia estar vinculando a este serviço. Um refrigerador pode ser obrigatório também. Isso não faz o inválido declaração .. qualquer maneira jk
Sherif elKhatib

7

Serviceé um dos componentes da estrutura Android, que não requer a execução da interface do usuário, o que significa que mesmo quando o aplicativo não é usado ativamente pelo usuário, você pode executar algumas operações com o serviço. Isso não significa que o serviço será executado em um thread separado, mas ele será executado no thread principal e a operação poderá ser executada em um thread separado, quando necessário. Os exemplos de usos estão tocando música em segundo plano, sincronizando dados com o servidor no backgroud sem a interação do usuário etc.

AsyncTaskpor outro lado, é usado para tarefas de bloqueio da interface do usuário a serem executadas em um encadeamento separado. É o mesmo que criar um novo encadeamento e executar a tarefa quando todas as tarefas de criação e manutenção dos encadeamentos e o retorno do resultado ao encadeamento principal são atendidos pelo uso do Exemplo AsyncTask.


você pode especificar por que acha que sua resposta adiciona algo à pergunta?
21117 erikbwork

2
outras respostas são curtas ou longas demais para os iniciantes entenderem. então eu respondi precisamente em palavras simples, com exemplos
Arjun

6

O serviço e asynctasks estão quase fazendo a mesma coisa, quase o uso do serviço ou de um asynctask depende de qual é o seu requisito.

por exemplo, se você deseja carregar dados para uma lista de exibição de um servidor depois de pressionar algum botão ou alterar a tela, é melhor ir com um asynctask.it é executado paralelamente ao thread principal da interface do usuário (é executado em segundo plano). na interface principal thread.after da saída do aplicativo, não há uma tarefa assíncrona.

Mas os serviços não são assim, depois que você inicia um serviço, ele pode ser executado depois que você sai do aplicativo, a menos que você interrompa o serviço. Como eu disse, depende de sua exigência. Se você deseja continuar verificando o recebimento de dados ou o estado da rede continuamente é melhor você ir com o serviço.

feliz codificação.


1
Oi Ashana, posso perguntar por que você forneceu esta resposta a uma pergunta que já foi respondida? Você está descontente com a resposta marcada existente? Ou você tenta criar um perfil de SO escrevendo sua opinião para todas as perguntas sobre as quais tem algo a dizer? Ou algo completamente diferente? Não consigo descobrir, mas vejo esse padrão com bastante frequência ultimamente.
Erikbwork

3
ya eu sei resposta já está dada e eu não vejo muito problema aqui se eu der a resposta certa ou a minha opinião aqui mano? porque você não é o único que procura a resposta para a mesma pergunta, se alguém difícil de entender a solução nas respostas acima, ele / ela pode rolar para baixo em busca de uma resposta que seja adequada para eles, entenda facilmente. Obrigado pelo comentário bro, im não um gênio ou profissional em programação, só quero ajudar os outros, tentar ensinar aos outros o que já sei :)
Ashana.Jackol

1

Em alguns casos, você pode obter a mesma funcionalidade usando os dois. Diferentemente da Tarefa assíncrona, o serviço possui seu próprio ciclo de vida e herda o contexto (o serviço é mais robusto que uma tarefa assíncrona). O serviço pode ser executado mesmo que você tenha saído do aplicativo. Se você quiser fazer algo mesmo após o fechamento do aplicativo e também precisar da variável de contexto, irá para o Serviço.

Exemplo: se você deseja tocar uma música e não deseja pausar se o usuário sair do aplicativo, você definitivamente irá procurar o Serviço.


1

Comparação de um Serviço local de classe base em processo ✱ com um AsyncTask:

This (Esta resposta não aborda serviços exportados ou qualquer serviço executado em um processo diferente do do cliente, pois os casos de uso esperados diferem substancialmente daqueles de um AsyncTask. Além disso, por uma questão de brevidade, a natureza de certos serviços especializados Servicesubclasses (por exemplo, IntentService, JobService) será ignorada aqui.)

Duração do processo

A Servicerepresenta, para o sistema operacional, "o desejo de um aplicativo de executar uma operação de execução mais longa sem interagir com o usuário" [ ref ].

Enquanto você está em Serviceexecução, o Android entende que você não quer que seu processo seja morto. Isso também é verdade sempre que você tem uma Activitytela e é especialmente verdade quando você está executando um serviço em primeiro plano . (Quando todos os componentes do seu aplicativo desaparecem, o Android pensa: "Ah, agora é um bom momento para encerrar este aplicativo, para que eu possa liberar recursos".)

Além disso, dependendo do último valor de retorno de Service.onCreate(), o Android pode tentar "reviver" aplicativos / serviços que foram eliminados devido à pressão do recurso [ ref ].

AsyncTasksnão faça nada disso. Não importa quantos threads de segundo plano você esteja executando ou o quanto eles estão trabalhando: o Android não manterá seu aplicativo ativo apenas porque ele está usando a CPU. É necessário que você saiba que seu aplicativo ainda tem trabalho a fazer; é por isso que Servicessão registrados no sistema operacional e AsyncTasksnão são.

Multithreading

AsyncTasks trata-se de criar um encadeamento em segundo plano no qual executar o trabalho e, em seguida, apresentar o resultado desse trabalho ao encadeamento da interface do usuário de maneira segura.

Cada nova AsyncTaskexecução geralmente resulta em mais simultaneidade (mais threads), sujeita às limitações do AsyncTasks'spool de threads [ ref ].

Servicemétodos, por outro lado, sempre são chamados no thread da interface do usuário [ ref ]. Isso se aplica a onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), etc. Então, em certo sentido, Servicesnão "run" no fundo. Depois que eles iniciam ( onCreate()), eles meio que ficam "sentados" lá - até a hora de limpar, executar um onStartCommand()etc.

Em outras palavras, adicionar mais Servicesnão resulta em mais simultaneidade. Os métodos de serviço não são um bom lugar para realizar grandes quantidades de trabalho, porque são executados no encadeamento da interface do usuário .

Obviamente, você pode estender Service, adicionar seus próprios métodos e chamá-los de qualquer thread que desejar. Mas se você fizer isso, a responsabilidade pela segurança do encadeamento ficará com você - e não a estrutura.

Se você deseja adicionar um encadeamento em segundo plano (ou algum outro tipo de trabalho) ao seu Service, você pode fazê-lo. Você pode iniciar um thread / AsyncTaskin de segundo plano Service.onCreate(), por exemplo. Mas nem todos os casos de uso exigem isso. Por exemplo:

  • Você pode manter uma Servicecorrida para poder continuar recebendo atualizações de localização em "segundo plano" (ou seja, sem necessariamente ter nenhuma Activitiestela).
  • Ou então, você pode manter seu aplicativo ativo apenas para manter um "implícito" BroadcastReceiverregistrado a longo prazo (após a API 26, você nem sempre pode fazer isso através do manifesto, portanto, é necessário se registrar no tempo de execução [ ref ]).

Nenhum desses casos de uso requer muita atividade da CPU; eles apenas exigem que o aplicativo não seja morto .

Como Trabalhadores

Servicesnão são orientados a tarefas. Eles não estão configurados para "executar uma tarefa" e "entregar um resultado", como AsyncTaskssão. Servicesnão resolva nenhum problema de segurança do encadeamento (apesar de todos os métodos serem executados em um único encadeamento). AsyncTasks, por outro lado, lide com essa complexidade para você.

Observe que AsyncTaskestá programado para descontinuação . Mas isso não significa que você deve substituir o seu AsyncTaskspor Services! (Se você aprendeu alguma coisa com esta resposta, isso deve ficar claro.)

TL; DR

Servicesexistem principalmente para "existir". Eles são como uma tela fora da tela Activity, fornecendo uma razão para o aplicativo permanecer vivo, enquanto outros componentes se encarregam de fazer o "trabalho". AsyncTasks"trabalha", mas eles não manterão, por si só, um processo vivo.

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.