web-dev-qa-db-fra.com

Android Volley ImageLoader - Paramètre BitmapLruCache?

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!

35
urSus
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);
    }
}
49
Vladimir Mironov

Ficus fournit cet exemple de code pour le Bitmap LRU:

https://Gist.github.com/ficusk/5614325

7
Keith

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 .

5
rdrobinson3

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);
    }
}
1
Manolo Garcia

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);
    }
}
0
Sunil Kumar