AsyncTaskLoader contre AsyncTask

129

Depuis Honeycombet le v4 Compatibility Libraryil est possible d'utiliser AsyncTaskLoader. D'après ce que je comprends, leAsyncTaskLoader peut survivre grâce à des changements de configuration comme des retournements d'écran.

Est-il recommandé d'utiliser à la AsyncTaskLoaderplace de AsyncTask? Est-ce LoaderManagerque ça rentre aussi dans l'image?

Mais je n'ai trouvé aucun bon exemple sur la façon d'utiliser correctement le AsyncTaskLoader. La documentation ne fournit également aucun exemple. Quelqu'un peut-il donner de bons exemples.

OKA
la source

Réponses:

51

Vous pouvez consulter le code source de la bibliothèque de compatibilité pour obtenir plus d'informations. Ce que FragmentActivityfait est:

  • tenir une liste des LoaderManager« s
  • assurez-vous qu'ils ne sont pas détruits lorsque vous retournez votre téléphone (ou qu'une autre modification de configuration se produit) en enregistrant les instances à l'aide de onRetainNonConfigurationInstance()
  • lancez le bon chargeur lorsque vous appelez initLoader()votre activité

Vous devez utiliser l' LoaderManagerinterface avec les chargeurs et fournir les rappels nécessaires pour créer votre ou vos chargeurs et remplir vos vues avec les données qu'ils renvoient.

En général, cela devrait être plus facile que de gérer AsyncTaskvous-même. Cependant, ce AsyncTaskLoadern'est pas exactement bien documenté, vous devriez donc étudier l'exemple dans la documentation et / ou modéliser votre code après CursorLoader.

Nikolay Elenkov
la source
5
Je vais y jeter un œil. Il est peut-être trop tôt pour trouver de bons exemples AsyncTaskLoader, et lorsque plus de développeurs commenceront à l'utiliser, d'autres exemples viendront.
OKA
47

Quand comparer AsyncTaskLoader et AsyncTask , comme vous le savez peut - être lorsque vous faites pivoter l' écran de votre appareil, il peut détruire et recréer votre activité, pour le rendre l' image claire de faire pivoter votre appareil pendant la transaction en réseau est en cours:

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

AsyncTaskLoader sera simplement réutilisé en se basant sur l'ID de chargeur précédemment enregistré dans Loader Manager, évitez donc 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 zombies.

Hoang Duc Dong
la source
11

AsyncTaskLoader exécute la même fonction que AsyncTask , mais un peu mieux. Il peut gérer plus facilement les modifications de configuration des activités et se comporte dans les cycles de vie des fragments et des activités. La bonne chose est que l'AsyncTaskLoader peut être utilisé dans n'importe quelle situation où l'AsyncTask est utilisé. Chaque fois que les 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.

Il y a cependant quelques problèmes avec l'utilisation d'AsyncTasks:

  • Les changements de configuration peuvent gâcher les choses
  • La suspension d'une activité ne met pas en pause la AsyncTask
  • Une bonne quantité de code standard (ce qui signifie plus d'erreurs possibles)

Documentation AsyncTaskLoader

Attif
la source
8

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

Lors de l'utilisation d' AsyncTaskLoader sur AsyncTask :

  • AsyncTaskLoader nous donne la liberté de charger les anciennes données mises en cache jusqu'à ce que de nouvelles données soient renvoyées parforceLoad()

  • Nous pouvons définir des retards à AsyncTaskLoader par ce setUpdateThrottle()qui peut empêcher les mises à jour consécutives au client (activité / Fragment)

  • AsyncTaskLoader peut être partagé avec plusieurs fragments s'ils ont une activité parent commune et si elle a été démarrée à partir degetActivity().getSupportLoaderManager()

  • AsyncTaskLoader est détruit LoaderMangerlorsque son activité liée n'est plus disponible. tandis que nous devons détruire manuellement AsyncTasks si son activité d'appel détruit. Cela nous fait gagner du temps en écrivant toutes les choses de compensation. AsyncTaskLoader fonctionne bien avec leurs cycles de vie respectifs.

Donc, AsyncTaskLoader est bien meilleur que AsyncTask.

Palak Darji
la source