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 peu liés au cycle de vie de l'activité
- Ils créent très facilement des fuites de mémoire.
A l'intérieur de la RoboSpice Application Motivations ( disponible sur Google Play ) nous répondons à cette question en détail. Il vous donnera une vue approfondie des AsyncTasks, des Loaders, de leurs caractéristiques et de leurs 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 commune dans Android et sont par nature des opérations de longue durée. . Voici un extrait de l'application :
Le cycle de vie des AsyncTask et des Activity
Les AsyncTasks ne suivent pas le cycle de vie des Activity instances. Si vous lancez une AsyncTask à l'intérieur d'une Activity et que vous faites pivoter le dispositif, l'Activity sera détruite et une nouvelle instance sera créée. Mais l'AsyncTask ne mourra pas. Elle continuera à vivre jusqu'à ce qu'elle soit terminée.
Et lorsqu'elle se termine, l'AsyncTask ne met pas à jour l'interface utilisateur de la nouvelle activité. En effet, elle met à jour l'ancienne instance de l'activité qui n'est plus affichée. Cela peut conduire à une Exception du type java.lang.IllegalArgumentException : View not attached to window manager si vous utilisez, par exemple, findViewById pour récupérer une vue dans l'activité.
Problème de fuite de mémoire
Il est très pratique de créer des AsyncTasks comme classes internes de vos activités. Comme l'AsyncTask devra manipuler les vues de l'Activity lorsque la tâche sera terminée ou en cours, l'utilisation d'une classe interne de l'Activity semble pratique. 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 à tous les champs de la classe externe. accéder directement à n'importe quel champ de la classe externe.
Néanmoins, cela signifie que la classe interne détiendra une référence invisible sur son instance de classe externe : l'activité.
A long terme, cela produit une fuite de mémoire : si l'AsyncTask dure longtemps, il 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 ramassée et c'est un mécanisme central d'Android pour préserver les ressources sur l'écran. mécanisme central d'Android pour préserver les ressources de l'appareil.
C'est vraiment une très très mauvaise idée d'utiliser les AsyncTasks pour des opérations de longue durée. Néanmoins, elles sont parfaites pour les opérations de courte durée, comme la mise à jour d'une vue après 1 ou 2 secondes.
Je vous encourage à télécharger le Application RoboSpice Motivations Il explique vraiment tout cela en profondeur et fournit des exemples et des démonstrations des différentes manières d'effectuer certaines opérations en arrière-plan.
2 votes
Le problème auquel j'ai été confronté lors du déploiement d'une application (qui utilise asyncTask) sur un appareil réel était que l'application longue durée
doInBackground
fige l'écran si une barre de progression n'est pas utilisée.2 votes
Parce qu'une AsyncTask est liée à l'activité dans laquelle elle est lancée. Donc si l'activité est tuée, votre instance AsyncTask peut être tuée aussi.
0 votes
Et si je créais l'AsyncTask dans un Service ? Cela ne résoudrait-il pas le problème ?
1 votes
Utilisez IntentService, la solution parfaite pour exécuter une longue opération en arrière-plan.