Android中使用LruCache缓存技术缓存数据

LruCache是Android提供的一个缓存工具类,该工具类依赖于最近最少使用的算法,这种算法的原理即是把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少

使用的对象在缓存值达到峰值时把它从内存中移除。

下面来讲解下,如何用该工具类缓存数据(这里我用了一个RecyclerView加载图片的Demo)

1、初始化LruCache

初始化LrcCache 首先得给它设置一个空间大小,这里官方推荐使用当前使用的应用的内存的1/8

/**
     * 得到当前的缓存大小(以当前内存的1/8,单位Kb)
     *
     * @return
     */
    public int getMemoryCacheSize() {
        return (int) Runtime.getRuntime().maxMemory() / 8 / 1024;
    }


LrcCache是一个泛型,因为在我的这个例子中是加载图片,所以我这里缓存的类型为Bitmap,因此这里我将LruCache的泛型设为LruCache<String,Bitmap>,String作为图片

的地址,Bitmap为存储的值。所以初始化大概就长这样

memoryCache = new LruCache<String, Bitmap>(getMemoryCacheSize()) {
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    return value.getByteCount() / 1024;//这里重写了这个函数,可以查看缓存空间使用的大小
                }
            };

2、初始化完之后,就到了最关键的地方,将对象缓存到缓存中,将对象从缓存中移除,移除缓存空间(具体看代码,没什么难度,主要就是调用工具类里面的方法)

/**
     * 清空当前缓存
     */
    public void clearCache() {
        if (memoryCache != null) {
            if (memoryCache.size() > 0) {
                memoryCache.evictAll();
            }
            memoryCache = null;
        }
    }

    /**
     * 添加对象进缓存
     *
     * @param key
     * @param bitmap
     */
    public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        Log.d(TAG, "当前缓存的数:" + memoryCache.size());
        if (memoryCache.get(key) == null) {
            if (key != null && bitmap != null) {
                memoryCache.put(key, bitmap);
            }
        } else {
            Log.i(TAG, "The key has already existed ");
        }
    }

    /**
     * 获取缓存中的对象
     *
     * @param key
     * @return
     */
    public synchronized Bitmap getBitmapFromMemCache(String key) {
        Bitmap bm = memoryCache.get(key);
        if (key != null)
            return bm;
        return null;
    }

    /**
     * 移除某一个对象
     *
     * @param key
     */
    public synchronized void removeImageCache(String key) {
        if (key != null) {
            if (memoryCache != null) {
                Bitmap bm = memoryCache.remove(key);
                if (bm != null)
                    bm.recycle();
            }
        }
    }

3、下面就是使用缓存

因为是用RecyclerView来显示图片,所以在ImageView显示图片之前需要从缓存中判断该图片是否已经存在,存在就从缓存中读取该Bitmap,不存在的话就先将图片资源获取

到然后给ImageView和缓存起来

Bitmap bitmap = LruCacheUtil.getInstance().getBitmapFromMemCache(urls[position]);
        if (bitmap != null) {
            holder.imageView.setImageBitmap(bitmap);
        } else {
            LruCacheUtil.getInstance().addBitmapToMemoryCache(urls[position], decodeSampledBitmapFromResource(urls[position], 400, 300));
            holder.imageView.setImageBitmap(decodeSampledBitmapFromResource(urls[position], 400, 300));
        }

4、以上就是使用缓存技术的具体实现

下面贴出两张图来对比下使用缓存和没使用缓存加载图片的效果


这是没有使用缓存,明显感到卡顿


使用了缓存的


最后如果你需要源码,点击这儿

猜你喜欢

转载自blog.csdn.net/android_hdh/article/details/52702911