35

新しい Volley ライブラリを使用したイメージ キャッシュの実装に問題があります。プレゼンテーションでは、コードは次のようになります

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

BitmapLruCache は明らかにツールキットに含まれていません。それを実装する方法や、いくつかのリソースを教えてくれるアイデアはありますか?

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

ありがとう!

4

5 に答える 5

50
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);
    }
}
于 2013-05-22T06:11:06.250 に答える
7

Ficus は、ビットマップ LRU のこのサンプル コードを提供します。

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

于 2013-05-24T21:29:29.757 に答える
5

Volley でディスクベースの LRU キャッシュを使用する例を次に示します。これは、Jake Wharton によって維持されている AOSP の DiskLruCache のバージョンの使用に基づいています。http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial

編集:これが推奨される方法であるため、デフォルトの実装としてインメモリ LRU キャッシュを含めるようにプロジェクトを更新しました。Volley は、独自の L2 キャッシュでディスク ベースのキャッシュを暗黙的に処理します。イメージ キャッシュは L1 キャッシュのみです。元の投稿を更新し、ここに詳細を追加しました: http://www.thekeyconsultant.com/2013/06/update-volley-image-cache.html .

于 2013-06-03T12:49:29.763 に答える
1

私がお勧めするのは、Singleton Bitmap Cache を使用することです。これにより、このキャッシュはアプリの全期間にわたって利用できるようになります。

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);
    }
}
于 2013-05-23T15:20:25.960 に答える
0

これは、OOM を処理するための新しい API で提供されます

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);
    }
}
于 2014-09-03T07:39:26.667 に答える