J'ai du mal à implémenter le cache d'images à l'aide de la nouvelle bibliothèque Volley. Dans la présentation, le code ressemble à ceci
mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
Le BitmapLruCache n'est évidemment pas inclus dans la boîte à outils. Une idée de la façon de le mettre en œuvre ou de me diriger vers certaines ressources?
http://www.youtube.com/watch?v=yhv8l9F44qo @ 14: 38
Merci!
import Android.graphics.Bitmap;
import Android.support.v4.util.LruCache;
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public BitmapLruCache() {
this(getDefaultLruCacheSize());
}
public BitmapLruCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
Ficus fournit cet exemple de code pour le Bitmap LRU:
Voici un exemple d'utilisation d'un cache LRU basé sur disque avec Volley. Il est basé sur l'utilisation d'une version de DiskLruCache d'AOSP maintenue par Jake Wharton. http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial
Edit: J'ai mis à jour le projet pour inclure un cache LRU en mémoire comme implémentation par défaut car c'est la méthode recommandée. Volley gère implicitement le cache basé sur disque dans son propre cache L2. Le cache d'image n'est que le cache L1. J'ai mis à jour le message d'origine et ajouté plus de détails ici: http://www.thekeyconsultant.com/2013/06/update-volley-image-cache.html .
Ce que je conseille, c'est d'utiliser un Singleton Bitmap Cache afin que ce cache soit disponible pendant toute la durée de vie de votre application.
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mMemoryCache;
private static BitmapCache mInstance;
private BitmapCache(Context ctx) {
final int memClass = ((ActivityManager) ctx
.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
// Use 1/16th of the available memory for this memory cache.
final int cacheSize = 1024 * 1024 * memClass / 16;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
public static BitmapCache getInstance(Context ctx) {
if (mInstance == null) {
mInstance = new BitmapCache(ctx);
}
return mInstance;
}
@Override
public Bitmap getBitmap(String url) {
return mMemoryCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mMemoryCache.put(url, bitmap);
}
}
il s'agit d'une nouvelle API pour gérer le MOO
public class BitmapMemCache extends LruCache<string, Bitmap> implements ImageCache {
public BitmapMemCache() {
this((int) (Runtime.getRuntime().maxMemory() / 1024) / 8);
}
public BitmapMemCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap bitmap) {
int size = bitmap.getByteCount() / 1024;
return size;
}
public boolean contains(String key) {
return get(key) != null;
}
public Bitmap getBitmap(String key) {
Bitmap bitmap = get(key);
return bitmap;
}
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}