AsyncTaskLoader vs AsyncTask

Depuis Honeycomb et la v4 Compatibility Library il est possible d’utiliser AsyncTaskLoader . D’après ce que je comprends, le AsyncTaskLoader peut survivre à travers les changements de configuration comme les renversements d’écran.

Est-il recommandé d’utiliser AsyncTaskLoader au lieu de AsyncTask ? Est- LoaderManager que LoaderManager est aussi dans la photo?

Mais je n’ai trouvé aucun bon exemple sur la manière d’utiliser correctement AsyncTaskLoader . Les documents ne fournissent également aucun exemple. Quelqu’un peut-il fournir de bons exemples.

Vous pouvez consulter le code source de la bibliothèque de compatibilité pour obtenir plus d’informations. Qu’est-ce qu’un FragmentActivity fait est:

  • Conserver une liste de LoaderManager
  • assurez-vous qu’ils ne sont pas détruits lorsque vous retournez votre téléphone (ou qu’un autre changement de configuration se produit) en enregistrant des instances à l’aide de onRetainNonConfigurationInstance()
  • kick le bon chargeur lorsque vous appelez initLoader() dans votre activité

Vous devez utiliser le LoaderManager pour interfacer les chargeurs et fournir les rappels nécessaires pour créer vos chargeurs et remplir vos vues avec les données renvoyées.

Généralement, cela devrait être plus facile que de gérer AsyncTask vous-même. Cependant, AsyncTaskLoader n’est pas bien documenté, vous devez donc étudier l’exemple dans docs et / ou modéliser votre code après CursorLoader .

Lorsque vous comparez AsyncTaskLoader et AsyncTask , comme vous le savez peut-être lorsque vous faites pivoter l’écran de votre appareil, cela peut détruire et recréer votre activité, pour que l’image permette la rotation de votre appareil pendant la transaction réseau:

AsyncTask sera à nouveau exécuté en tant que thread d’arrière-plan, et le traitement des threads d’arrière-plan précédents était juste redondant et zombie.

AsyncTaskLoader sera simplement réutilisé sur la base de l’ID du chargeur enregistré dans Loader Manager avant, évitez ainsi de ré-exécuter la transaction réseau.

En résumé, AsyncTaskLoader empêche la duplication des threads d’arrière-plan et élimine la duplication des activités zombie.

AsyncTaskLoader exécute la même fonction que AsyncTask , mais un peu mieux. Il peut gérer plus facilement les modifications de la configuration d’activité et se comporte au cours des cycles de vie des fragments et des activités. La bonne chose est que AsyncTaskLoader peut être utilisé dans toutes les situations où AsyncTask est utilisé. Chaque fois que des données doivent être chargées en mémoire pour que l’activité / le fragment puisse être géré, AsyncTaskLoader peut mieux faire le travail.

L’utilisation d’AsyncTasks pose cependant quelques problèmes:

  • Les modifications de configuration peuvent gâcher les choses
  • Mettre une activité en pause ne met pas en pause la tâche asynchrone
  • Une bonne quantité de code standard (ce qui signifie plus d’erreurs possibles)

AsyncTaskLoader doc

Quelques différences autres que décrites dans d’autres réponses:

Lorsque vous utilisez AsyncTaskLoader sur AsyncTask :

  • AsyncTaskLoader nous permet de charger les anciennes données mises en cache jusqu’à ce que de nouvelles données soient renvoyées par forceLoad()

  • Nous pouvons définir des délais pour AsyncTaskLoader par setUpdateThrottle() ce qui peut empêcher des mises à jour consécutives du client (activité / fragment)

  • AsyncTaskLoader peut être partagé avec plusieurs fragments s’ils ont une activité parente commune et s’il a été démarré à partir de getActivity().getSupportLoaderManager()

  • AsyncTaskLoader est détruit par LoaderManger lorsque son activité liée n’est plus disponible. alors que nous devons détruire manuellement AsyncTasks si l’activité de son appelant est détruite . Cela nous évite d’écrire tous les trucs de compensation. AsyncTaskLoader joue bien avec leurs cycles de vie respectifs.

AsyncTaskLoader est donc bien meilleur que AsyncTask.