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; }
的地址,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
- Android中使用LruCache缓存技术缓存数据
- android 缓存技术lrucache
- Android 关于使用LruCache缓存你想缓存的数据
- Android 关于使用LruCache缓存你想缓存的数据
- Android 关于使用LruCache缓存你想缓存的数据
- Android 关于使用LruCache缓存你想缓存的数据
- Android中的LruCache缓存技术
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- Android使用 LruCache 缓存图片
- 开发android机顶盒应用 事件,焦点处理
- 机器虚席
- VideoView实现全屏和横屏播放
- Android Dimension转换算法原理分析
- UIFont 设置字体 与字体效果预览
- Android中使用LruCache缓存技术缓存数据
- 帧内/帧间预测要点
- thymeleaf学习
- 网络技术—操作路由器命令行代码课堂笔记
- LeakCanary——直白的展现Android中的内存泄露
- 移动前端开发遇到的一些问题及解决方案
- 安装Python及PIL类库步骤小结
- 大数据分析与机器学习领域Python兵器谱
- svn 图标所表示的意思