Différence entre service, tâche asynchrone et thread?

147

Quelle est la différence entre Service, Async Task & Thread. Si je ne me trompe pas, tous sont habitués à faire des choses en arrière-plan. Alors, comment décider lequel utiliser et quand?

SpunkerBaba
la source
Il semble qu'il y ait une autre chose avec laquelle les gens peuvent souvent se confondre: les chargeurs . Sujet
RBT

Réponses:

186

Vous avez probablement déjà lu la description de la documentation à leur sujet, je ne les répéterai pas, j'essaierai plutôt de répondre avec mes propres mots, en espérant qu'ils vous aideront.

  • Le service est comme une activité mais n'a pas d'interface utilisateur. Probablement si vous voulez récupérer la météo par exemple, vous ne créerez pas d'activité vide pour cela, vous utiliserez pour cela un service.

  • Un fil est un fil, vous le connaissez probablement déjà depuis une autre partie. Vous devez savoir que vous ne pouvez pas mettre à jour l'interface utilisateur à partir d'un thread. Vous devez utiliser un gestionnaire pour cela, mais lisez plus loin.

  • Une AsyncTask est un Thread intelligent qu'il est conseillé d'utiliser. Intelligent car il peut aider avec ses méthodes, et il existe trois méthodes qui s'exécutent sur le thread d'interface utilisateur, ce qui est bon pour mettre à jour les composants de l'interface utilisateur.

J'utilise fréquemment les services, AsyncTasks. Thread moins, ou pas du tout, car je peux presque tout faire avec AsyncTask.

Pentium10
la source
1
Merci pour votre explication. Donc, si j'ai besoin de créer une application qui récupère des données sur le Web, quel serait un meilleur service d'option ou une tâche asynchrone?
SpunkerBaba
16
Vous devez utiliser les deux. Vous créez un service et à l'intérieur que vous utilisez AsyncTask.
Pentium10
4
Ajoutez à la réponse ci-dessus, AsyncTask passe par 4 étapes onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Result), {running in UI thread}, doInBackground (Params ...) {running in background thread}. Puisqu'il fournit 3 méthodes dans le thread d'interface utilisateur, l'utilisateur n'a pas à s'inquiéter de l'utilisation de gestionnaires ou de rappels pour mettre à jour l'interface utilisateur.
SpunkerBaba
11
@ Pentium10: au lieu de Service + AsyncTask, vous pouvez souvent utiliser un IntentService
njzk2
11
Il convient également de noter que, par défaut, les services Android s'exécutent sur le thread principal (UI). Si votre service doit fonctionner en arrière-plan, il doit être lancé explicitement dans un thread distinct (ou AsyncTask). Sinon, cela peut risquer d'interrompre la réactivité de l'interface utilisateur et de générer des erreurs d'application ne répondant pas. Un service pour Android est essentiellement une activité «invisible» et «miniature», PAS nécessairement un travailleur «d'arrière-plan».
CCJ
23

C'est la réponse la plus simple à votre question

Fil

est une unité d'exécution qui s'exécute "parallèlement" au thread principal est un point important, vous ne pouvez pas mettre à jour un composant d'interface utilisateur à partir de n'importe quel thread ici sauf le thread principal.

AsyncTask

est un thread spécial, qui vous donne des méthodes d'assistance pour mettre à jour l'interface utilisateur afin que, fondamentalement, vous puissiez mettre à jour l'interface utilisateur même AsyncTask fonctionnera sur un thread d'arrière-plan. Il n'est pas nécessaire que la gestion des communications interprocessus soit effectuée explicitement.

Un service

résoudre le problème ci-dessus car il est séparé de l'activité qui l'invoque afin qu'il puisse continuer à s'exécuter même lorsque l'activité est détruite, il s'exécute dans le thread principal (méfiez-vous de l'ANR) utilisez un service d'arrière-plan (étendez IntentService, il crée automatiquement le thread de travail pour vous) . Le service est comme une activité sans interface utilisateur , est bon pour une longue tâche

Alejandro Serret
la source
4
AyncTask ne serait pas recréé lors de la rotation de l'appareil car il n'est pas synchronisé avec les méthodes du cycle de vie de l'activité.
CopsOnRoad
4
vous créez l'AsyncTask dans un hook de cycle de vie d'activité et lorsque vous faites pivoter le téléphone, l'activité est détruite et redémarrée. L'instance précédente de l'AsyncTask est connectée à cette activité que vous venez de détruire et pour cette raison, vous obtiendrez un "Forcer la fermeture" mais vous verrez également comment une nouvelle instance de l'AsynTask se déclenche à nouveau. Vous pouvez utiliser des fragments pour conserver AsyncTask et définir setRetainInstance (true) sur le fragment qui vous aidera.
Alejandro Serret
15

Quelques informations supplémentaires que j'aurais aimé que quelqu'un me dise il y a quelques jours:

  • Vous pouvez partager des variables globales, telles que des threads, entre les activités et les services.
  • Votre application ainsi que toutes ses variables globales ne seront pas effacées tant qu'une activité ou un service est toujours présent.
  • Si vous avez une instance d'un service dans votre application et que le système d'exploitation a besoin de ressources, il tue d'abord vos activités, mais tant qu'il y a le service, le système d'exploitation n'effacera pas votre application avec ses variables globales.

Mon cas d'utilisation est le suivant: j'ai un thread dans l'espace global qui est connecté à un serveur et une activité qui montre les résultats. Lorsque l'utilisateur appuie sur le bouton d'accueil, l'activité passe en arrière-plan et un nouveau service est démarré. Ce service lit ensuite les résultats du fil de discussion et affiche des informations dans la zone de notification si nécessaire. Je ne m'inquiète pas de la destruction de mon activité par le système d'exploitation car je sais que tant que le service est en cours d'exécution, il détruira le fil.

Peter Jankuliak
la source
9

En bref, Service pour time consuming tasks, AsyncTask pour short-lived tasks, Thread est un standard java constructionpour les threads.

Abbath
la source
3

Du point de vue du développeur:

Thread : Utilisé pour exécuter l'ensemble de codes parallèlement au thread principal. Mais vous ne pouvez pas gérer l'interface utilisateur à l'intérieur du thread. Pour cela, vous devez utiliser Handler. Hadler fonctionne comme un thread mais peut également gérer l'interface utilisateur.

ASyncTask : utilisé pour gérer les tâches que vous ne pouvez pas faire fonctionner sur le thread principal. Par exemple, une requête HTTP est un travail très lourd qui ne peut pas être géré sur le thread principal, vous gérez donc la requête HTTP dans le ASyncTaskCela fonctionne en parallèle avec votre thread principal de manière asynchrone en arrière-plan.Il a peu de méthodes de rappel qui sont appelées sur leur correspondant événements.

Service : est un processus d'arrière-plan. Il est utilisé lorsque vous devez effectuer un traitement auquel aucune interface utilisateur n'est associée.

Rahul Raina
la source
1
Servicene sera pas nécessairement exécuté en arrière-plan, sauf si vous utilisez IntentService. Si vous avez démarré un standart à Servicepartir de l'UiThread, il fonctionnera sur l'UiThread.
yshahak
@yshahak Vous avez raison, mais ici, nous n'avons pas besoin de définition profonde. L'utilisateur veut juste connaître la différence entre eux.
Rahul Raina
Oui, mais ce n'est pas précis, car Servicene fonctionnera pas dans un processus différent par défaut, mais dans le processus d'application avec les autres composants. Mieux vaut dire que Servicecela fonctionnera dans l'arrière-plan du fil de discussion qu'il vivra à l'intérieur.
yshahak le
Les trois éléments ci-dessus fonctionnent dans le cadre du processus de candidature. Les méthodes preExecute () et postExecute () d'ASyncTask fonctionnent sur UIThread et doInBackground () & onProgress () fonctionnent sur le thread d'arrière-plan. Le service fonctionne sur le thread d'arrière-plan et le thread fonctionne également sur le thread d'arrière-plan. Cependant Handler fonctionne sur UI Thread.
Rahul Raina
2

Le service est comme une tâche longue activité, mais la tâche Async nous permet d'effectuer des opérations longues / en arrière-plan et d'afficher son résultat sur le thread de l'interface utilisateur sans avoir à manipuler les threads.

Pankaj
la source