Je ne sais pas quand on choisirait AsyncTask plutôt qu'un gestionnaire. Disons que j'ai du code que je veux exécuter toutes les n secondes qui mettra à jour l'interface utilisateur. Pourquoi choisirais-je l'un plutôt que l'autre?
128
Réponses:
IMO, AsyncTask a été écrit pour fournir un moyen pratique et facile à utiliser de réaliser un traitement en arrière-plan dans les applications Android, sans trop se soucier des détails de bas niveau (threads, boucles de messages, etc.). Il fournit des méthodes de rappel qui aident à planifier des tâches et également à mettre à jour facilement l'interface utilisateur chaque fois que nécessaire.
Cependant, il est important de noter que lors de l'utilisation d'AsyncTask, un développeur se soumet à ses limitations, qui résultent des décisions de conception prises par l'auteur de la classe. Par exemple, j'ai récemment découvert qu'il y avait une limite au nombre de travaux pouvant être planifiés à l'aide d'AsyncTasks.
Handler est plus transparent des deux et vous donne probablement plus de liberté; donc si vous voulez plus de contrôle sur les choses, vous choisirez Handler, sinon AsynTask fonctionnera très bien.
la source
AsyncTasks
sont exécutés sur un thread, donc plus de parallélisme. Vous pouvez toujours les exécuter sur uneExecutor
implémentation parallèle .Ma règle d'or serait:
Si vous faites quelque chose d'isolement lié à l'interface utilisateur, par exemple le téléchargement de données à présenter dans une liste, continuez et utilisez
AsyncTask
.Si vous effectuez plusieurs tâches répétées, par exemple le téléchargement de plusieurs images qui doivent être affichées
ImageViews
(comme le téléchargement de vignettes) lors du téléchargement, utilisez une file d'attente de tâches avecHandler
.la source
Essayez toujours d'éviter d'utiliser AsyncTask lorsque cela est possible, principalement pour les raisons suivantes:
AsyncTask n'est pas garanti de s'exécuter car il existe une base ThreadPool et une taille maximale définies par le système et si vous créez trop d'asynctask, elles seront finalement détruites
AsyncTask peut être automatiquement arrêté, même en cours d'exécution, en fonction du cycle de vie de l'activité et vous n'avez aucun contrôle dessus
Les méthodes AsyncTask exécutées sur le thread d'interface utilisateur, comme onPostExecute, peuvent être exécutées lorsque l'activité à laquelle elle fait référence n'est plus visible ou est peut-être dans un état de disposition différent, comme après un changement d'orientation.
En conclusion, vous ne devriez pas utiliser les méthodes liées à UIThread d'AsyncTask, ce qui est son principal avantage !!! De plus, vous ne devez effectuer que des travaux non critiques sur doInBackground. Lisez ce fil pour plus d'informations sur ces problèmes:
AsyncTask est-il vraiment défectueux sur le plan conceptuel ou est-ce que je manque juste quelque chose?
Pour conclure, essayez de préférer utiliser IntentServices, HandlerThread ou ThreadPoolExecutor au lieu d'AsyncTask lorsque l'un des problèmes mentionnés ci-dessus peut vous préoccuper. Bien sûr, cela nécessitera plus de travail, mais votre application sera plus sûre.
la source
Si vous voulez faire un calcul toutes les x secondes, vous devriez probablement planifier un
Runnable
sur aHandler
(avecpostDelayed()
) et celaRunnable
devrait commencer dans le thread d'interface utilisateur actuel. Si vous souhaitez le démarrer dans un autre thread, utilisez HandlerThread. AsyncTask est plus facile à utiliser pour nous mais pas mieux que handler.la source
Le gestionnaire est associé au thread principal de l'application. il gère et planifie les messages et les exécutables envoyés depuis les fils d'arrière-plan vers le fil principal de l'application.
AsyncTask fournit une méthode simple pour gérer les threads d'arrière-plan afin de mettre à jour l'interface utilisateur sans la bloquer par des opérations fastidieuses.
La réponse est que les deux peuvent être utilisés pour mettre à jour l'interface utilisateur à partir des threads d'arrière-plan, la différence se situant dans votre scénario d'exécution. Vous pouvez envisager d'utiliser le gestionnaire si vous souhaitez publier des messages différés ou envoyer des messages à MessageQueue dans un ordre spécifique.
Vous pouvez envisager d'utiliser AsyncTask si vous souhaitez échanger des paramètres (mettant ainsi à jour l'interface utilisateur) entre le thread principal de l'application et le thread d'arrière-plan d'une manière simple et pratique.
la source
AsyncTask
suppose que vous ferez quelque chose sur le thread de l'interface utilisateur, une fois le travail d'arrière-plan terminé. De plus, vous ne pouvez l'exécuter qu'une seule fois (après cela, son statut estFINISHED
et vous obtiendrez une exception essayant de l'exécuter une fois de plus). En outre, la flexibilité de son utilisation n'est pas grande. Oui, vous pouvez utiliserTHREAD_POOL_EXECUTOR
pour une exécution parallèle, mais l'effort pourrait ne pas en valoir la peine.Handler
ne présume rien, sauf la gestion des exécutables et des messages. En outre, il peut être exécuté autant de fois que vous le souhaitez . Vous êtes libre de décider à quel thread il doit être attaché, comment il communique avec les autres gestionnaires, peut-être les produire avecHandlerThread
. Donc, c'est beaucoup plus flexible et adapté à certains travaux répétés.Vérifiez différents types d'
Handler
exemples ici .la source
Ce sont les meilleures questions d'entrevue qui sont posées. AsyncTask - Ils sont utilisés pour décharger le thread de l'interface utilisateur et effectuer des tâches en arrière-plan. Handlers - Android dosent a un moyen de communication direct entre l'interface utilisateur et le thread d'arrière-plan. Les gestionnaires doivent être utilisés pour envoyer des messages ou exécutables via la file d'attente de messages.
Ainsi, les AsyncTasks sont utilisés lorsque les tâches doivent être exécutées en arrière-plan et les gestionnaires sont utilisés pour la communication entre une interface utilisateur et un thread d'arrière-plan.
la source
doInBackground - fonctionne essentiellement dans un autre thread. onPostExecute - publie les résultats sur le thread d'interface utilisateur et envoie un message en interne au gestionnaire du thread principal. Le thread d'interface utilisateur principal a déjà un looper et un gestionnaire qui lui sont associés.
Donc, fondamentalement, si vous devez effectuer une tâche en arrière-plan, utilisez AsyncTask. Mais finalement, si quelque chose doit être mis à jour sur l'interface utilisateur, il utilisera le gestionnaire du thread principal.
la source