Asynctask vs Thread dans Android

135

Dans l'interface utilisateur, pour effectuer un travail de fond, j'ai utilisé un fichier Thread. Mais comme suggéré par d'autres, j'utilise maintenant AsyncTask.

Quelle est la principale différence entre a Threadet an AsyncTask?

Dans quel scénario, dois-je utiliser un Threadou un AsyncTask?

RAM
la source
@ webaldo.at Je l'ai référé, ici ils ont donné une description et une différence entre Asynctask et Thread.Je veux savoir dans quel cas, par exemple, la connexion réseau, le fichier lu pour cela, ce que j'utilise ?.
Ram
Raccourci: Thread -> No Access to the UI-Thread || Asynctask -> Accès conditionnel à UI-Thread
JavaDM
pour la tâche d'arrière-plan IntentService est une autre option intéressante.
Chen
1
Double
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

146

Pour les tâches de longue durée ou gourmandes en ressources processeur, il existe essentiellement deux façons de le faire: les threads Java et l'AsyncTask natif d'Android.

Aucun des deux n'est nécessairement meilleur que l'autre, mais il est essentiel de savoir quand utiliser chaque appel pour tirer parti des performances du système.

Utilisez AsyncTask pour:

  1. Opérations réseau simples qui ne nécessitent pas le téléchargement de beaucoup de données
  2. Tâches liées au disque qui peuvent prendre plus de quelques millisecondes

Utilisez les threads Java pour:

  1. Opérations réseau qui impliquent des quantités de données modérées à importantes (téléchargement ou téléchargement)
  2. Tâches à processeur élevé qui doivent être exécutées en arrière-plan
  3. Toute tâche pour laquelle vous souhaitez contrôler l'utilisation du processeur par rapport au thread GUI

Et il existe de nombreuses bonnes ressources sur Internet qui peuvent vous aider:

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

Mohit
la source
Puis-je demander pourquoi la quantité de données téléchargées est un problème?
Yeung
1
@Yeung On dirait que vous avez besoin d'informations sur les tâches asynchrones! Regardez, plus la quantité de données est grande, puis nettement plus le temps nécessaire pour effectuer la même opération. Par conséquent, il n'est pas recommandé d'effectuer un processus de longue durée à l'aide de la tâche Async pour les raisons suivantes: 1. La tâche Async est mal liée au cycle de vie de l'activité. 2. Ils créent des fuites de mémoire.
Mohit
3
Jetez un œil à ceci: stackoverflow.com/questions/12797550/…
Mohit
Je vous remercie. Je comprends le risque maintenant.
Yeung
@Impasse @Yeung IMO quantité de données n'est pas un problème, le problème clé avec les opérations du réseau c'est le moment de l'opération. Même le téléchargement de quelques octets peut prendre un certain temps, lorsque le serveur est occupé, inaccessible (timeout), etc. Un correctif pourrait être d'utiliser AsyncTaskavec son propre planificateur.
xmedeko
44

Si vous utilisez des threads Java, vous devez gérer les exigences suivantes dans votre propre code:

Synchronisation avec le thread principal si vous publiez les résultats sur l'interface utilisateur

Pas de valeur par défaut pour l'annulation du fil

Pas de pool de threads par défaut

Aucune valeur par défaut pour la gestion des modifications de configuration dans Android

Tarun Varshney
la source
3
c'est en fait plus élucidant car il aborde les raisons pour lesquelles ne pas utiliser de simples threads. Dans mon esprit, tout ce qui doit être lié au cycle de vie Activité / Service devrait utiliser AsyncTask à la place, même si vous devez «dégrader» manuellement les ressources à l'intérieur de la tâche, au moins vous ne vous retrouvez pas avec la tâche suspendue lorsque l'activité est tuée.
leRobot
28

Fil

  • Tâche longue en général
  • Invoquer par la méthode thread.start ()
  • Déclenché à partir de n'importe quel thread
  • Fonctionne sur son propre thread
  • La gestion manuelle des threads / le code peuvent devenir difficiles à lire

AsyncTask

  • Petite tâche devant communiquer avec le fil principal
  • Invoquer par la méthode excute ()
  • Déclenché à partir du thread principal
  • S'exécute sur le thread de travail
  • Doit être exécuté et créé à partir du thread principal
Umang Kothari
la source
11

Fil

Un thread est une unité d'exécution simultanée. Il a sa propre pile d'appels. Il existe deux méthodes pour implémenter des threads dans les applications.

La première consiste à fournir une nouvelle classe qui étend Thread et remplace sa méthode run (). L'autre consiste à fournir une nouvelle instance de Thread avec un objet exécutable lors de sa création. Un thread peut être exécuté en appelant sa méthode "start". Vous pouvez définir la "priorité" d'un thread en appelant sa méthode "setPriority (int)".

Un thread peut être utilisé si vous n'avez aucun effet dans la partie UI. Par exemple, vous appelez un service Web ou téléchargez des données, et après le téléchargement, vous les affichez sur votre écran. Ensuite, vous devez utiliser un gestionnaire avec un thread et cela compliquera votre application pour gérer toutes les réponses des threads.

Un gestionnaire vous permet d'envoyer et de traiter des objets Message et Runnable associés à MessageQueue d'un thread. Chaque fil a chaque file d'attente de messages. (Comme une liste de tâches), et le thread prendra chaque message et le traitera jusqu'à ce que la file d'attente de messages soit vide. Ainsi, lorsque le gestionnaire communique, il donne simplement un message au thread appelant et il attendra le traitement.

Si vous utilisez des threads Java, vous devez gérer les exigences suivantes dans votre propre code:

Synchronisation avec le thread principal si vous publiez les résultats sur l'interface utilisateur Pas de valeur par défaut pour l'annulation du thread Pas de pool de threads par défaut Pas de valeur par défaut pour la gestion des changements de configuration dans Android

AsyncTask

AsyncTask permet une utilisation correcte et facile du thread d'interface utilisateur. Cette classe permet d'effectuer des opérations en arrière-plan et de publier les résultats sur le thread d'interface utilisateur sans avoir à manipuler les threads et / ou les gestionnaires. Une tâche asynchrone est définie par un calcul qui s'exécute sur un thread d'arrière-plan et dont le résultat est publié sur le thread d'interface utilisateur.

AsyncTask passera par les 4 étapes suivantes:

onPreExecute ()

Appelé sur le thread de l'interface utilisateur avant l'exécution de la tâche

doInbackground (Paramètres ..)

Appelé sur le thread d'arrière-plan immédiatement après la fin de l'exécution de onPreExecute ().

onProgressUpdate (Progression ..)

Appelé sur le thread d'interface utilisateur après un appel à publishProgress (Progress ...).

onPostExecute (Résultat)

Appelé sur le thread d'interface utilisateur une fois le calcul en arrière-plan terminé.

Pourquoi devriez-vous utiliser AsyncTask?

Facile à utiliser pour un thread d'interface utilisateur. (Donc, utilisez-le lorsque le thread appelant est un thread d'interface utilisateur).

Pas besoin de manipuler les gestionnaires.

Pour plus d'informations, visitez ici

Vipul Purohit
la source
2

Fil:

Threaddoit être utilisé pour séparer les opérations de longue durée du thread principal afin d'améliorer les performances. Mais il ne peut pas être annulé avec élégance et il ne peut pas gérer les changements de configuration d'Android. Vous ne pouvez pas mettre à jour l'interface utilisateur à partir de Thread.

AsyncTaskpeut être utilisé pour gérer des éléments de travail d'une durée inférieure à 5 ms. Avec AsyncTask, vous pouvez mettre à jour l'interface utilisateur contrairement à java Thread. Mais de nombreuses tâches de longue durée vont étouffer les performances.

Vous avez peu d'alternatives supplémentaires aux deux.

HandlerThread / Handler et ThreadPoolExecutor

Reportez-vous à l'article ci-dessous pour plus de détails:

Gestionnaire vs AsyncTask vs Thread

Ravindra babu
la source