Android:LruCache不起作用

时间:2014-07-23 15:44:09

标签: android

我按照developer.android.com上的链接创建了以下代码:

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory()) / 1024;
    final int cacheSize = maxMemory;

    mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {

        @Override
        protected int sizeOf(String key, Bitmap value) {
            return super.sizeOf(key, value);
        }
    };

    if(getBitmapFromCache(sBitmapCacheKey) == null) {
        Log.e(LOG_TAG, "No image cached");
        applyBlur();
    }else{
        Log.e(LOG_TAG, "Found image cached, applying");
        setBackgroundFromCache();
    }

方法applyBlur()

    private void applyBlur() {
    Log.e(LOG_TAG, "applying blur");
    blur(convert(WallpaperManager.getInstance(this).getDrawable()), null);
}

private void blur(Bitmap bitmap, View view) {
    long start = System.currentTimeMillis();
    float radius = 25;

    ...          

    addBitmapToCache(sBitmapCacheKey, overlay);

    rs.destroy();
    Log.e(LOG_TAG, "It took: " + (System.currentTimeMillis() - start) + "ms");
}

applyBlur()是我用来创建Bitamp并添加到LruCache的方法。

从Logcat它总是说“没有图像缓存”并将创建一个全新的Bitmap

我是一个新手,所以我之前没有使用过缓存,任何想法都会非常感谢,谢谢。

1 个答案:

答案 0 :(得分:2)

您的缓存无法正常工作有几个原因。如前所述,首先需要具有匹配的大小函数。您无法将缓存初始化为内存大小,然后在sizeOf函数中使用图像计数(反之亦然)。如果您想使用图片大小,则需要将sizeOf函数更改为以下内容:

@Override
protected int sizeOf(final String key, final Bitmap value) {
    return value.getRowBytes() * value.getHeight();
}

其次,您需要更好地掌握缓存的使用方式,以及Activity生命周期的工作原理。在Activity中创建和存储它不会起作用,因为Android操作系统可能随时会破坏Activity,这将导致您的Cache被垃圾收集(从内存中删除)。 避免这种情况的一种方法是创建一个扩展LruCache的新类,然后使用一个初始化缓存的单例getter函数,任何人都可以使用它。这是一个例子:

public final class Example extends LruCache<String, Bitmap> {

    private static Example instance;

    private Example(final int maxSize) {
        super(maxSize);
    }

    public static Example get() {
        if (instance == null) {
            final int cacheSize = (int) (Runtime.getRuntime().maxMemory()) / 1024;
            instance = new Example(cacheSize);
        }
        return instance;
    }

    @Override
    protected int sizeOf(final String key, final Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }

}

要在Activity中使用此功能,您只需致电Example.get(),这样就可以在所有活动中始终为您提供相同的缓存,确保在存储位图时在一个活动中,它也适用于任何其他活动。