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:
LoaderManager
onRetainNonConfigurationInstance()
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:
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.