35 votes

Android Volley ImageLoader - BitmapLruCache paramètre?

J'ai de la difficulté de mise en œuvre de cache des Images à l'aide de la nouvelle Volley de la bibliothèque. Dans la présentation, le code ressemble à ceci

mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());

Le BitmapLruCache est évidemment pas inclus dans la trousse à outils. Une idée de comment le mettre en œuvre ou de me pointer à certaines ressources?

http://www.youtube.com/watch?v=yhv8l9F44qo @14:38

Merci!

49voto

vmironov Points 9810
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);
    }
}

7voto

Keith Points 849

Ficus fournit cet exemple de code pour l'image LRU:

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

5voto

rdrobinson3 Points 295

Voici un exemple d'utilisation d'un Disque en fonction LRU cache avec le Volley. Il est basé sur l'utilisation d'une version de PSBA de DiskLruCache maintenu par Jake Wharton. http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial

Edit: j'ai mis à jour afin d'inclure d'une mémoire cache LRU comme l'implémentation par défaut car c'est la méthode recommandée. Volley implicitement gère le cache disque dans son propre cache L2. Le cache des images est juste le cache L1. J'ai mis à jour le post original et ajouté un peu plus de détail ici: http://www.thekeyconsultant.com/2013/06/update-volley-image-cache.html.

1voto

Manolo Garcia Points 966

Ce que je conseille est d'utiliser un Singleton Bitmap Cache donc ce cache va être disponible pendant toute la durée de vie de votre app.

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);
    }
}

0voto

sunil Points 3539

c'est arrive dans de nouvelles API pour gérer le OOM

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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X