J'essaie de comprendre la mise en cache des images de Volley. J'ai un fragment avec gridview à l'intérieur, qui chargera environ 12-30 images. Ces images sont extraites du serveur et j'utilise NetworkImageView pour charger ces images.
Je suis capable d'afficher les images dans le NetworkImageView et tout fonctionne bien. Mais, lorsque je change de fragment
et que je reviens au fragment précédent, dans LogCat
, je vois que Volley tente de récupérer les images.
J'ai lu que Volley s'occupe automatiquement de la mise en cache des images. Quand l'image est mise en cache dans la première fragment
, pourquoi cherche-t-elle à la récupérer, quand je suis revenu de seconde en première? En premier lieu, les données LogCat
affichent-elles les demandes d'images de Volley? ou autre chose...
Ci-dessous mon code:
Dans onCreate ()
queue = Volley.newRequestQueue(getActivity());
imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(
10);
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
});
Logcat lors du premier chargement du fragment:
02-18 14:21:20.724: D/Volley(14713): [4944] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2> [lifetime=3782], [size=398563], [rc=200], [retryCount=0]
02-18 14:21:20.874: D/Volley(14713): [4943] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/st-vincent.jpg 0x800c5bdc LOW 3> [lifetime=3941], [size=501475], [rc=200], [retryCount=0]
02-18 14:21:20.894: D/Volley(14713): [1] Request.finish: 4181 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2
02-18 14:21:20.974: D/Volley(14713): [1] Request.finish: 4260 ms: [ ] http://xx.files.wordpress.com/2014/02/st-vincent.jpg 0x800c5bdc LOW 3
02-18 14:21:20.994: D/dalvikvm(14713): GC_FOR_ALLOC freed 1914K, 6% free 68371K/72184K, paused 11ms, total 11ms
02-18 14:21:20.994: I/dalvikvm-heap(14713): Grow heap (frag case) to 72.368MB for 5843106-byte allocation
02-18 14:21:21.014: D/dalvikvm(14713): GC_FOR_ALLOC freed 1K, 5% free 74076K/77892K, paused 15ms, total 15ms
02-18 14:21:21.074: D/Volley(14713): [1] Request.finish: 4336 ms: [ ] http://xx.files.wordpress.com/2014/02/underwater.gif 0x800c5bdc LOW 8
02-18 14:21:21.214: D/Volley(14713): [4945] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5> [lifetime=4155], [size=482380], [rc=200], [retryCount=0]
02-18 14:21:21.244: D/Volley(14713): [1] Request.finish: 4494 ms: [ ] http://xx.files.wordpress.com/2014/01/albarn-everyday-robots.jpg 0x800c5bdc LOW 9
02-18 14:21:21.274: D/Volley(14713): [1] Request.finish: 4551 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5
02-18 14:21:21.994: D/Volley(14713): [1] Request.finish: 5244 ms: [ ] http://xx.files.wordpress.com/2014/02/macdemarco_baby.jpg 0x800c5bdc LOW 10
02-18 14:21:22.934: D/Volley(14713): [1] Request.finish: 6183 ms: [ ] http://xx.files.wordpress.com/2014/01/nenehcherry_lank01.jpg 0x800c5bdc LOW 11
Quand je reviens sur le même fragment la deuxième fois: Je viens de visiter le second fragment et de revenir au premier fragment - Pas beaucoup d’écart entre les deux ..
02-18 14:27:46.164: D/dalvikvm(14713): GC_FOR_ALLOC freed 29047K, 26% free 91776K/122752K, paused 23ms, total 23ms
02-18 14:27:47.994: D/dalvikvm(14713): GC_FOR_ALLOC freed 2957K, 21% free 97010K/122752K, paused 20ms, total 20ms
02-18 14:27:48.274: D/Volley(14713): [1] Request.finish: 3244 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-2-58-16-pm.png 0x800c5bdc LOW 6
02-18 14:27:48.294: D/dalvikvm(14713): GC_FOR_ALLOC freed 2007K, 21% free 97932K/122752K, paused 14ms, total 14ms
02-18 14:27:48.324: D/Volley(14713): [4956] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2> [lifetime=3272], [size=398563], [rc=200], [retryCount=0]
02-18 14:27:48.484: D/Volley(14713): [1] Request.finish: 3456 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2
02-18 14:27:48.974: D/dalvikvm(14713): GC_FOR_ALLOC freed 1030K, 15% free 104815K/122752K, paused 56ms, total 56ms
02-18 14:27:49.054: D/Volley(14713): [1] Request.finish: 4022 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5
02-18 14:27:49.314: D/Volley(14713): [1] Request.finish: 4276 ms: [ ] http://xx.files.wordpress.com/2014/01/albarn-everyday-robots.jpg 0x800c5bdc LOW 9
02-18 14:27:49.374: D/Volley(14713): [1] Request.finish: 4325 ms: [ ] http://xx.files.wordpress.com/2014/01/nenehcherry_lank01.jpg 0x800c5bdc LOW 11
02-18 14:27:49.404: D/Volley(14713): [1] Request.finish: 4355 ms: [ ] http://xx.files.wordpress.com/2014/02/macdemarco_baby.jpg 0x800c5bdc LOW 10
02-18 14:27:49.654: D/dalvikvm(14713): GC_FOR_ALLOC freed 1456K, 12% free 108705K/122752K, paused 27ms, total 27ms
02-18 14:27:49.734: D/Volley(14713): [1] Request.finish: 4691 ms: [ ] http://xx.files.wordpress.com/2014/02/underwater.gif 0x800c5bdc LOW 8
02-18 14:27:50.304: D/dalvikvm(14713): GC_FOR_ALLOC freed 11584K, 16% free 103314K/122752K, paused 47ms, total 47ms
02-18 14:27:50.334: D/Volley(14713): [1] Request.finish: 5281 ms: [ ] http://xx.files.wordpress.com/2014/02/echo-and-the-bunnymen.jpg 0x800c5bdc LOW 12
Comme le montrent les liens, Volley accède aux mêmes URL. Est-ce que Volley essaie d'obtenir des images du serveur? ou montre-t-il simplement les URL qu'il charge depuis la mémoire cache?
Comment créer des images de cache Volley? Si cela ne gère pas la mise en cache pour le moment, avec mon code ci-dessus, que dois-je faire pour l'obtenir?
J'ai essayé de changer la valeur maxSize
de 10 à 100*1024*1024 (100MB)
mais cela ne s'est pas arrêté pour que Volley produise les mêmes valeurs.
Volley n'a pas donné l'option de mise en cache directement. vous devez créer votre propre outil fourni par Volley. Voir Mise en cache des images réseau , Jake Wharton avait écrit sur le mécanisme de mise en cache en utilisant Volley. Personnalisation de Volley de Jake Wharton
Utilisez-vous Volley comme un singleton? Si vous ne l'utilisez pas et que vous n'utilisez pas un contexte commun pour requestQueue, cela ne fonctionnera pas comme prévu. La documentation sur cette partie de Volley est particulièrement inutile (du moins depuis que je l’ai utilisée pour la dernière fois). Une fois configuré correctement, il lira/écrira dans le cache comme prévu.
Voici un projet GitHub avec une classe VolleySingleton que vous pouvez utiliser avec des exemples: CypressNorth/Volley-Singleton
Voici un article de blog décrivant la configuration plus en détail: Configuration du chargeur d’images Android Google Volley pour NetworkImageView
Pensez à utiliser Glide, recommandé par Android pour le chargement d'images dans votre application. Comparé à volley, Glide fournit une mise en cache automatique des images.
Pour ajouter Glide dans votre application:
Étape 1) Mettre à jour le fichier build.gradle
dependencies {
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.Android.support:support-v4:19.1.0'
}
Étape 2) Ajouter la permission INTERNET dans le fichier manifeste
<uses-permission Android:name="Android.permission.INTERNET" />
Étape 3) Ajouter ImageView dans votre mise en page
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/imageView"
>
</ImageView>
Étape 4) Utilisation du glissement dans l'activité
//Initialize ImageView
ImageView imageView = (ImageView) findViewById(R.id.imageView);
//Loading image from below url into imageView
Glide.with(this)
.load("IMAGE URL HERE")
.placeholder(R.drawable.placeholder)
.error(R.drawable.imagenotfound)
.override(200, 200);
.centerCrop();
.into(imageView);
Lire plus sur Bibliothèque Android Glide
Vous pouvez voir dans le lien ci-dessous la suite de ma question sur la mise en œuvre du cache d'image avec Volley à l'aide de DiskLruCache et VolleyImageCacheExample de Jake Wharton. Cela fonctionne comme prévu et les images sont mises en cache. Merci pour votre aide.
DiskLruCache de JakeWharton - Comment implémenter avec Volley?
Le moyen le plus simple de mettre en cache les images avec Volley que j'ai trouvées consistait à utiliser une variable RequestQueue
avec une variable DiskBasedCache
. Mon objectif était de réduire la bande passante plutôt que les temps de chargement. Cela permet également de réduire l'encombrement de la mémoire.
val cacheSizeInMegabytes = 5
val cacheSizeInBytes = cacheSizeInMegabytes * 1024 * 1024
val cacheDir = File(context.cacheDir, "volleyCache")
val cache = DiskBasedCache(cacheDir, cacheSizeInBytes)
val httpStack = HurlStack()
val networkStack = BasicNetwork(httpStack)
val queue = RequestQueue(cache, networkStack)
queue.start()
Ensuite, utilisez simplement la variable queue
et assurez-vous d’avoir request.setShouldCache(true)
(ou non).
Vous pouvez vérifier cela, j'avais activé le mécanisme de cache L1 et L2 pour Volley.
Volley avec cache . Assurez-vous que le contrôle du cache doit être activé dans l'en-tête de la réponse.