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
?
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é.
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é.
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:
N'oubliez pas de vérifier la connectivité avant d'essayer de mettre à jour l'emplacement.
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.
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
AsyncTask
et IntentService
ont beaucoup de même
AsyncTask
nous utilisons souvent onProgressUpdate
, onPostExecute
ou si vous voulez vous pouvez utiliser BroadcastReceiver
IntentService
nous utilisons BroadcastReceiver
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
AsyncTask
pour certaines tâches qui commencent, se terminent, interagissent avec l'interface utilisateur dans 1 Activity
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.
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