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

来源:互联网 发布:腾讯视频网络不稳定 编辑:程序博客网 时间:2024/06/04 19:35

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、以上就是使用缓存技术的具体实现

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


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


使用了缓存的


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

0 0
原创粉丝点击