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.
Vous pouvez consulter le code source de la bibliothèque de compatibilité pour obtenir plus d'informations. Qu'est-ce qu'un FragmentActivity
fait:
LoaderManager
'onRetainNonConfigurationInstance()
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
.
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.
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:
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.