C'est une très bonne question, il faut du temps en tant que programmeur Android pour bien comprendre le problème. En effet, AsyncTask a deux problèmes principaux qui sont liés:
- Ils sont mal liés au cycle de vie de l'activité
- Ils créent très facilement des fuites de mémoire.
Dans l' application RoboSpice Motivations ( disponible sur Google Play ), nous répondons à cette question en détail. Il vous donnera une vue approfondie des AsyncTasks, des chargeurs, de leurs fonctionnalités et inconvénients et vous présentera également une solution alternative pour les requêtes réseau: RoboSpice. Les requêtes réseau sont une exigence courante dans Android et sont par nature des opérations de longue durée. Voici un extrait de l'application:
Le cycle de vie AsyncTask et Activity
AsyncTasks ne suit pas le cycle de vie des instances Activity. Si vous démarrez une AsyncTask à l'intérieur d'une activité et que vous faites pivoter l'appareil, l'activité sera détruite et une nouvelle instance sera créée. Mais l'AsyncTask ne mourra pas. Il continuera à vivre jusqu'à ce qu'il soit terminé.
Et une fois terminé, AsyncTask ne mettra pas à jour l'interface utilisateur de la nouvelle activité. En effet, il met à jour l'ancienne instance de l'activité qui n'est plus affichée. Cela peut conduire à une exception de type java.lang.IllegalArgumentException: vue non attachée au gestionnaire de fenêtres si vous utilisez, par exemple, findViewById pour récupérer une vue à l'intérieur de l'activité.
Problème de fuite de mémoire
Il est très pratique de créer des AsyncTasks en tant que classes internes de vos activités. Comme l'AsyncTask devra manipuler les vues de l'activité lorsque la tâche est terminée ou en cours, l'utilisation d'une classe interne de l'activité semble pratique: les classes internes peuvent accéder directement à n'importe quel champ de la classe externe.
Néanmoins, cela signifie que la classe interne contiendra une référence invisible sur son instance de classe externe: l'activité.
Sur le long terme, cela produit une fuite de mémoire: si l'AsyncTask dure longtemps, elle maintient l'activité "vivante" alors qu'Android voudrait s'en débarrasser car elle ne peut plus être affichée. L'activité ne peut pas être récupérée et c'est un mécanisme central pour Android pour préserver les ressources sur l'appareil.
C'est vraiment une très très mauvaise idée d'utiliser AsyncTasks pour des opérations de longue durée. Néanmoins, ils conviennent pour ceux qui sont de courte durée, tels que la mise à jour d'une vue après 1 ou 2 secondes.
Je vous encourage à télécharger l' application RoboSpice Motivations , elle explique vraiment cela en profondeur et fournit des exemples et des démonstrations des différentes façons d'effectuer certaines opérations en arrière-plan.
doInBackground
gèle l'écran si une barre de progression n'est pas utilisée.