2013-06-05 5 views
21

J'ai un peu aimé le cadre de Volley, mais j'ai encore quelques doutes à ce sujet. Par exemple, comment Volley s'aligne-t-il avec le modèle Loader? Comme les requêtes sont traitées de manière asynchrone, l'appel en arrière-plan n'a pas beaucoup de sens. D'un autre côté, si nous ignorons le pattern Loader, nous annulerons le chargement et rechargerons les ressources nécessaires, c'est un peu gâché.Android Volley + modèle de chargeur?

Comment le framework Volley fonctionne-t-il avec les chargeurs sous Android?

Répondre

4

AFAIK et je l'ai vu dans les sources, les réponses à vos demandes seront mises en cache, IF le serveur envoie la mise en cache correcte headers (GATE), et la deuxième fois que vous essayez de faire une demande GET, au même URL, vous recevrez une réponse du cache, au lieu d'appeler à nouveau le Network (par défaut Volley met en cache les demandes en utilisant key le URL).

Ajout Requests au RequestQueue doit se faire de la MainThread, car il n'a pas de sens de les appeler à partir d'un arrière-plan Thread.

+0

Je pensais à une situation où l'utilisateur fait tourner le dispositif pendant le chargement. Le comportement normal du framework Volley est d'annuler les requêtes et de les redémarrer lorsque le changement d'orientation est terminé. L'utilisation du pattern Loader protégerait l'état de chargement des changements d'orientation. – husrevo

+0

oui. vous avez raison.il n'y a pas de "straight-out", c'est-à-dire "se reconnecter" à une requête en attente, ou "keep it" en cours et obtenir des réponses sur les changements d'orientation/Activity Stop-Resume. –

+1

Il est logique de l'appeler depuis un thread d'arrière-plan dans des situations telles que le chargement d'informations supplémentaires pour une notification push avant son affichage. Cependant, pour des raisons générales, il est préférable de l'appeler depuis le thread principal. – Gabriel

1

Il est possible de faire des requêtes synchrones avec Volley via la classe RequestFuture. Je n'ai pas examiné cela personnellement, mais il semble que vous pourriez tirer parti de cela avec un Loader pour obtenir le meilleur des deux mondes (Cache de Volley avec la stabilité de chargement du Loader).

+0

De cette façon, votre 'Loader' ne peut pas retourner les résultats intermédiaires et finaux. 'RequestFuture' renvoie uniquement le premier résultat reçu (qui est intermédiaire si vous utilisez le cache); résultat final met à jour juste le cache et ne peut pas être propagé à l'interface utilisateur. –

+0

Bon point. À ce stade, je ne recommanderais pas d'utiliser des chargeurs du tout, je pense qu'ils ont trop de frais généraux et il est préférable de créer votre propre solution à partir de bibliothèques externes telles que Retrofit ou Volley. – Gabriel

+0

Il n'y a pas besoin de requêtes synchrones. Si vous étendez 'Loader ', vous devez quand même travailler dans le fil d'arrière-plan. – Pijusn

12

Un chargeur peut encapsuler pratiquement n'importe quoi, y compris les demandes Volley. Lorsque votre Loader encapsule un framework qui gère déjà le travail en arrière-plan pour vous et vous rappelle sur le thread principal, comme Volley, votre implémentation de chargeur ne doit pas hériter de AsyncTaskLoader mais simplement de la classe de base Loader. Vous devez ensuite démarrer la requête Volley dans la méthode onForceLoad(). Lorsque votre chargeur récupère le résultat sur le thread principal via un rappel, il suffit de le pousser sur l'activité/fragment en appelant deliverResult().

Votre chargeur devra également garder une référence à la demande Volley en cours pour pouvoir l'annuler en onStopLoading(). OnStopLoading() n'est pas appelé en cas de changement de configuration comme la rotation de l'écran, uniquement lorsque vous quittez l'activité. Le seul inconvénient est que les chargeurs n'ont pas de mécanisme intégré pour propager les erreurs, contrairement à Volley. Ainsi, dans votre rappel d'erreur Volley à l'intérieur de votre Loader, vous devrez soit livrer un résultat nul, soit envoyer une diffusion locale pour notifier l'activité/le fragment de l'erreur.