Android Volley + JSONObjectRequest La Mise En Cache
public class CustomRequest extends JsonObjectRequest {
public CustomRequest(String url, JSONObject params,
Listener<JSONObject> listener, ErrorListener errorListener)
throws JSONException {
super(Method.POST,url, params, listener,
errorListener);
this.setShouldCache(Boolean.TRUE);
}
}
J'espérais que ce morceau de code serait assez pour moi d'obtenir implicite de la mise en cache des réponses. Je ne suis pas sûr si cela fonctionne ou pas, parce que j'étais sous l'hypothèse lorsqu'une demande est envoyée:
-
il aurait frappé le cache en premier, et l'envoyer à onresponse
-
puis, quand les résultats sont fournis par le serveur distant, il permettrait à la onresponse
Mise à jour:
J'ai compris comment faire pour récupérer manuellement le cache et de le reconstruire dans un JSONObject et l'envoyer par OnResponse fonction, mais qui ne semble pas efficace vu qu'il n'y est implicite, la mise en cache. JsonObjectRequest classe doit retourner JSONObject que l'entrée de cache au lieu de premières données de réponse.
Mais je suis toujours intéressé de savoir si je suis en train de faire une erreur.
L'ambiguïté est uniquement en raison de l'absence de documentation, donc je m'excuse si je suis absent quelque chose de tout à fait évident.
Vous devez vous connecter pour publier un commentaire.
Voir cette réponse - La date d'expiration de la politique pour le cache à l'aide de Google Volley
Cela signifie Volley décide de la mise en cache de réponse ou ne se fonde pas uniquement sur les en-têtes de "Cache-Control", puis "date d'Expiration", "maxAge".
Ce que vous pourriez faire est de changer cette méthode
com.android.volley.toolbox.HttpHeaderParser.parseCacheHeaders(NetworkResponse response)
et d'ignorer ces en-têtes, ensemble
entry.softTtl
etentry.ttl
champs de quelque valeur que ce soit qui fonctionne pour vous et utilisez votre méthode dans votre demande de classe. Voici un exemple:Utiliser cette méthode dans votre classe de Requête comme ceci:
(+177 ) [687] cache-hit-parsed
177ms pour ré-analyse de la réponse.parseIgnoreCacheHeaders
méthode, car pour moi elle n'est pas modifiable dès maintenant.build.gradle
fichier à inclure dans un module de la bibliothèque. Ensuite, vous pouvez faire des changements dans ses sources.oleksandr_yefremov offre une grande codes qui peuvent vous aider lorsque vous traitez avec la stratégie de cache de Android Volley, surtout quand le RESTE de l'API a une mauvaise "Cache-Control" en-têtes ou si vous voulez plus de contrôle sur votre propre application stratégie de cache.
La clé est
HttpHeaderParser.parseCacheHeaders(NetworkResponse response))
. Si vous voulez avoir votre propre stratégie de cache. Le remplacer parparseIgnoreCacheHeaders(NetworkResponse response)
dans correspondant de la classe.Si votre classe étend JsonObjectRequest, allez à la JsonObjectRequest et trouver
et remplacer
HttpHeaderParser.parseCacheHeaders(response)
avecHttpHeaderParser.parseIgnoreCacheHeaders
NetworkImageView
?+1 pour oleksandr_yefremov et skyfishjy aussi, et offre ici un béton, classe réutilisable adapté pour json ou autre chaîne, à base d'Api:
où la fonction parseIgnoreCacheHeaders() provient de la oleksandr_yefremov réponse ci-dessus. Utiliser le CachingStringRequest classe n'importe où que le json est ok pour mettre en cache pendant 3 minutes (en direct) et 24 heures (expiré, mais toujours disponible). Un exemple de demande:
et dans le rappel de l'objet de onResponse() fonction de parser le json. Réglez la mise en cache des limites de ce que vous voulez--vous pouvez paramétrer pour ajouter personnalisée d'expiration par demande.
Pour le plaisir, essayez ceci dans une application simple qui télécharge json et rend le téléchargement des informations. Après avoir rempli le cache avec le premier succès de télécharger, regarder la rapidité du rendu que vous changer les orientations, tandis que le cache est en direct (pas de téléchargement se produit donné un live en cache). Maintenant tuer l'application, attendre 3 minutes pour que le cache expire (mais pas 24 heures pour qu'il soit retiré du cache), activez le mode avion, et redémarrez l'application. Le Volley erreur de rappel va se produire, ET le "succès" onResponse() rappel se fera à partir de données mises en cache, permettant à votre application à la fois de rendre le contenu et aussi savoir/avertir qu'il venait de cache.
Une utilisation de ce type de mise en cache serait d'éviter les Chargeurs et les autres moyens de traiter avec changement d'orientation. Si une demande est transmise par l'intermédiaire d'un terrain de Volley singleton, et les résultats sont mis en cache, rafraîchit, qui se produisent par changement d'orientation sont rendus rapidement à partir du cache, automatiquement par la reprise de Volée, sans le Chargeur.
Bien sûr, cela ne correspond pas à toutes les exigences. YMMV
J'ai été en mesure de forcer le Volley-en cache toutes les réponses en étendant
StringRequest
et le remplacement de la demande, je veux de force cache avecCachingStringRequest
.Dans la méthode substituée
parseNetworkResponse
- je supprimerCache-Control
en-têtes. De cette façon, Volley est la persistance de la réponse, c'est intégré dans le cache.