web-dev-qa-db-fra.com

Dois-je utiliser AsyncTask ou IntentService pour mon application?

J'ai lu sur la connectivité Internet avec Android et j'ai remarqué qu'il existe différentes façons de gérer cela, c'est-à-dire AsyncTask et IntentService . Cependant, je ne sais toujours pas lequel utiliser. Mon application est essentiellement un localisateur de position/sentiers avec Google Maps. Ma connectivité Internet sera utilisée pour trouver les sentiers les plus proches dans un certain rayon de la Ainsi, chaque fois qu'un utilisateur déplace ou fait glisser la carte vers un nouvel emplacement, il se met à jour avec les pistes les plus proches. Il ajoute également une nouvelle piste et permet à l'utilisateur d'évaluer une piste.

AsyncTask suffira-t-il pour cela ou devrais-je utiliser IntentService?

52
Johnathan Au

Vous devez utiliser un AsyncTask pour les tâches répétitives courtes qui sont étroitement liées à une activité, comme ce que vous essayez actuellement de faire. IntentService sont plus orientés vers des tâches planifiées (répétitives ou non) qui doivent s'exécuter en arrière-plan, indépendamment de votre activité.

48
ebarrenechea

Ils peuvent être utilisés très différemment à des fins différentes.

AsyncTask est un utilitaire de threading pratique qui peut être utilisé si vous devez constamment dire quelque chose à l'utilisateur ou effectuer périodiquement des opérations sur le thread principal. Il offre beaucoup de contrôle à grain fin, et en raison de sa nature, il est très facile de travailler avec dans le Activity alors qu'un IntentService nécessite généralement l'utilisation du BroadcastReceiver ou IBinder framework.

IntentService peut être utilisé à peu près comme un AsyncTask, mais il est destiné au téléchargement en arrière-plan, au téléchargement ou à d'autres opérations de blocage qui ne nécessitent pas d'interaction utilisateur ou de thread principal. Par exemple, si vous souhaitez télécharger et mettre en cache des cartes, vous pouvez appeler un IntentService afin que l'utilisateur n'ait pas besoin de regarder l'application pour qu'elle puisse la télécharger. De même, si vous envoyez des données à votre serveur, un IntentService est extrêmement utile à cet égard car vous pouvez démarrer et oublier. L'utilisateur peut, par exemple, taper un commentaire dans votre application, puis appuyer sur "envoyer". "Envoyer" lancera le IntentService qui récupère le commentaire et l'envoie à votre serveur sur un thread d'arrière-plan. L'utilisateur peut appuyer sur "envoyer" et quitter l'application immédiatement et le commentaire atteindra finalement vos serveurs (en supposant bien sûr qu'il n'y ait aucune erreur). Si vous avez fait cela avec un AsyncTask dans votre Activity d'un autre côté, le système pourrait tuer votre processus au milieu de votre échange et il pourrait ou non passer.

D'une manière générale, aucun n'est destiné aux applications de longue durée. Ils sont destinés à de courtes opérations ponctuelles. Ils peuvent être utilisés pour des actions permanentes ou de longue durée, mais ce n'est pas recommandé.

55
DeeV

AsyncTask ne fonctionne pas bien avec les changements de configuration ou d'autres choses qui redémarrent l'activité.

IntentService est bon pour quelque chose qui devrait toujours être disponible, quel que soit le temps nécessaire pour faire son travail. Je préfère IntentService dans la plupart des cas, car AsyncTask dépend beaucoup plus de l'état d'activité.

Quelques notes:

  • AsyncTask est meilleur pour les tâches rapides qui devraient revenir directement à l'interface utilisateur, mais il peut être utilisé dans une variété de situations.
  • La déclaration "effectuer périodiquement des opérations sur le thread principal" est vague. AsyncTask génère un nouveau thread d'arrière-plan qui est différent de le thread principal et fait son travail sur le nouveau thread. D'où le nom AsyncTask.
  • Un IntentService ne nécessite pas de "manipuler" le framework BroadcastReceiver. Il vous suffit d'envoyer une intention de diffusion locale et de la détecter dans votre activité. Que ce soit plus difficile à faire qu'un AsyncTask, je ne sais pas.
  • IntentService is destiné à effectuer des tâches de longue durée, ce qu'il fait en arrière-plan.
  • AsyncTaskLoader est OK à utiliser, mais il est censé être la classe de base pour CursorLoader, etc. Si vous souhaitez actualiser les pistes "à proximité" lorsque les utilisateurs se déplacent vers un nouvel emplacement, un IntentService est probablement mieux.

N'oubliez pas de vérifier la connectivité avant d'essayer de mettre à jour l'emplacement.

21
Joe Malin

Les AsyncTasks sont très étroitement liés aux activités et peuvent souvent provoquer des fuites d'erreurs de fenêtre si vous quittez l'activité qui a créé la tâche async. Mais ils sont parfaits pour afficher une barre de progression, car vous pouvez rapidement mettre à jour le pourcentage de progression.

IntentServices sont plus propres et plus sûrs. Ils sont plus difficiles à implémenter lorsque vous êtes un débutant Android, mais une fois que vous aurez appris à les démarrer et à les gérer, vous ne retournerez probablement jamais à AsyncTasks!

IntentServices permet également une conception plus modulaire dans votre application. Je crée généralement une classe distincte pour tous mes IntentServices, mais pour AsyncTasks, je les crée en tant que classe interne Activity. Si je devais séparer une AsyncTask d'une Activité, je devrais passer le Contexte d'Activité et les objets View dans le constructeur AsyncTask qui peuvent être désordonnés.

8
Lou Morda

Comme mentionné ci-dessus, AsyncTask résoudra votre problème.

Mais gardez à l'esprit que AsyncTask a une faiblesse importante: il ne gère pas bien Activity "rafraîchir" (par exemple pendant la rotation). Cela peut être un problème si, par exemple, l'utilisateur fait pivoter le téléphone pendant que votre AsyncTask charge toujours des éléments. Si c'est effectivement un problème pour vous, je recommande AsyncTaskLoader:

http://developer.Android.com/reference/Android/content/AsyncTaskLoader.html

6
ivan.aguirre

AsyncTask et IntentService ont beaucoup de même

  • Peut exécuter la tâche dans le thread de travail
  • Peut fonctionner en arrière-plan
  • Continuez à courir jusqu'à ce que la tâche soit terminée, l'activité qui a commencé est détruite
  • Peut notifier la mise à jour de l'interface utilisateur pendant l'exécution de la tâche ou après la fin de la tâche
    • Pour AsyncTask nous utilisons souvent onProgressUpdate, onPostExecute ou si vous voulez vous pouvez utiliser BroadcastReceiver
    • Pour IntentService nous utilisons BroadcastReceiver

Différent

1) Envoyer la tâche en cours d'exécution ou après avoir terminé

Exemple, nous avons une tâche: télécharger le fichier à partir de la base du serveur sur fileName.

en utilisantAsyncTask

Si nous une instance de AsyncTask, lors de l'exécution du téléchargement du fichier A, nous ne pouvons pas exécuter le fichier de téléchargement B AsyncTask (puisque nous obtenons Java.lang.IllegalStateException: Cannot execute task: the task is already running.). De plus, une fois le téléchargement du fichier A terminé, nous ne pouvons pas exécuter le téléchargement du fichier B (car nous obtenons Java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once).
Pour télécharger le fichier B pendant ou après le téléchargement du fichier A, nous devons créer une nouvelle instance de AsyncTask.
=> Pour télécharger les fichiers A et B, nous avons besoin de 2 instances de AsyncTask => 2 threads de travail créés

en utilisantIntentService

Pendant le téléchargement du fichier A, nous pouvons avons envoyé l'intention de télécharger le fichier B => une fois le téléchargement du fichier A terminé, le téléchargement automatique du fichier B => n'a pas besoin d'une nouvelle instance, pas besoin d'un nouveau thread de travail .

Si nous avons envoyé l'intention de télécharger le fichier B après le téléchargement du fichier A est terminé? Une fois le téléchargement du fichier A terminé, IntentSevice sera détruit (car il n'y a plus de tâche). Par conséquent, lors du démarrage du téléchargement du fichier B, une nouvelle instance de Service est créée, mais aucun nouveau thread créé (le service continue à utiliser un seul thread de travail dont le nom est défini dans le constructeur IntentSevice

2) Implémenter AsyncTask est plus facile que IntentService

EN UTILISANT
Nous verrons que AsyncTask et IntentService ont beaucoup de mêmes donc dans la plupart des cas nous pouvons utiliser AsyncTask ou IntentService. toutefois

  • J'utilise souvent AsyncTask pour certaines tâches qui commencent, se terminent, interagissent avec l'interface utilisateur dans 1 Activity
  • J'utilise souvent IntentService pour certaines tâches qui peuvent démarrer/terminer et interagir ou ne pas interagir avec l'interface utilisateur à partir de n'importe quel Activity

Cette réponse est basée sur mon test. S'il vous plait corrigez moi si je me trompe. J'espère que cela vous aidera.

4
Phan Van Linh

En bref, AsyncTask est destiné aux tâches courtes qui doivent communiquer avec le thread principal. IntentService est destiné aux tâches longues qui n'ont pas à communiquer avec le thread principal.

Pour plus d'informations, consultez ces liens

http://www.onsandroid.com/2011/12/difference-between-Android.html

https://medium.com/@skidanolegs/asynctask-vs-intentservice-1-example-without-code-5250bea6bdae

https://Android.jlelse.eu/using-intentservice-vs-asynctask-in-Android-2fec1b853ff4

0
Hasan El-Hefnawy