web-dev-qa-db-fra.com

AsyncTaskLoader vs AsyncTask

Depuis Honeycomb et le v4 Compatibility Library il est possible d'utiliser AsyncTaskLoader. D'après ce que j'ai compris, le AsyncTaskLoader peut survivre grâce aux changements de configuration tels que les retournements d'écran.

Est-il recommandé d'utiliser AsyncTaskLoader au lieu de AsyncTask? Est-ce que LoaderManager entre également 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 fournir de bons exemples.

128
OKA

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

  • garder une liste de LoaderManager '
  • assurez-vous qu'ils ne soient 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()
  • lancez le chargeur correct lorsque vous appelez initLoader() dans votre activité.

Vous devez utiliser LoaderManager pour vous connecter aux chargeurs et fournir les rappels nécessaires pour créer votre/vos chargeur (s) et renseigner vos vues avec les données qu'elles renvoient.

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

51
Nikolay Elenkov

Lorsque vous comparez AsyncTaskLoader vs AsyncTask, comme vous le savez peut-être lorsque vous faites pivoter l'écran de votre appareil, il est possible que votre activité soit détruite et recréée. appareil en cours de transaction réseau:

AsyncTask sera ré-exécuté en tant que thread d'arrière-plan, et le traitement précédent du thread d'arrière-plan était simplement redondant et zombie.

AsyncTaskLoader sera simplement réutilisé en vous basant sur l'ID de chargeur enregistré dans Loader Manager auparavant. Évitez donc de réexécuter la transaction réseau.

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

44
Hoang Duc Dong

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

L'utilisation de AsyncTasks pose cependant quelques problèmes:

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

doc AsyncTaskLoader

11
Attif

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

Lors de l'utilisation de 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 par forceLoad()

  • Nous pouvons définir les délais sur 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é parent commune et si elle a été démarrée à 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 l'appelant est détruite. Cela nous évite d’écrire tout ce que nous avons à faire. AsyncTaskLoader joue bien avec leurs cycles de vie respectifs.

Ainsi, AsyncTaskLoader est bien meilleur que AsyncTask.

8
Palak Darji