2015-11-26 5 views
0

J'utilise le volley comme ceci. Le problème est, Volley dans mon cas ne met en cache des images dans la mémoire, mais pas sur le disque. Si je force mon application, tous les caches seront retirés de la mémoire. Comment puis-je avoir des caches à la fois sur la mémoire et sur le disque?Volley ne met en cache que des images en mémoire, mais je veux que le cache soit sur le disque et la mémoire

public ImageLoader getImageLoader() { 
     getRequestQueue(); 
     if (mImageLoader == null) { 
      mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache(getApplicationContext())); 
     } 
     return this.mImageLoader; 
    } 

holder.picture.setImageUrl(url, MyApplication.getInstance().getImageLoader()); 

Note: j'avais utilisé DiskLruCache écrit par Jake Wharton et tout fonctionne bien, mais de cette façon, les caches existent uniquement sur le disque. Je veux que Volley obtienne le bitmap de la mémoire s'il existe, sinon du disque s'il existe, s'il n'y a pas de cache pour l'URL, faites un appel réseau.

Répondre

0

Volley essaie d'abord de trouver le cache dans LruBitmapCache, vous pouvez trouver des codes connexes ImageLoader.java

Bitmap cachedBitmap = mCache.getBitmap(cacheKey); 
if (cachedBitmap != null) { 
    // Return the cached bitmap. 
    ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null); 
    imageListener.onResponse(container, true); 
    return container; 
} 

Ensuite Volley va de la même manière que d'autres requêtes http (qui n'utilise pas ImageLoader). En résumé, un DiskLruCache est utilisé par défaut. Volley utilise CacheDispatcher pour gérer le cache sur disque. La stratégie de cache est basée sur Cache-Control et/ou d'autres en-têtes du serveur. Pour autant que je sache, volley va par défaut mettre en cache toutes les requêtes, en dépit de l'absence de cache-control ou d'en-têtes associés. Cependant, les caches ne seront pas utilisés si aucun en-tête n'existe.

Si vous ne voulez pas changer la logique de volley, vous pouvez envisager de prendre en charge Cache depuis le serveur.