浅谈Android轻量级的数据缓存框架RxCache
请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个APP的感觉,因此合理地使用缓存对网络请求的数据进行处理极为重要。合理的进行缓存和网络请求,可以为APP带来更优秀的体验。图片的缓存有Picasso、Glide、Fresco等非常著名的框架,它们极为成熟并且使用广泛,程序员应该做的是使用轮子而非重复造轮子。但对于网络数据的缓存,大多都是自用自封装,每个人都需要进行繁琐的编码工作。RxCache就对网络缓存进行了封装,并采用RxJava模式,可以与其他RxJava的代码无缝对接,使用极为方便。
RxCache使用LruCache和DiskLruCache对网络请求数据进行二级缓存,主要适配于接口API返回数据,不用于图片等的缓存。可以设置缓存模式、缓存大小,设置数据过期时间,并提供了根据key删除缓存和清空所有缓存的功能。提供了Gson方式和Serialize方式进行数据存储转换与还原。
项目GitHub地址
RxCache
开始使用:
首先在项目的Gradle中添加依赖:
RxCache使用JitPack进行依赖管理,所以需要先在项目的build.gradle中添加以下代码:
allprojects{
repositories{
...
maven{url 'https://jitpack.io'}
}
}
然后在Module的gradle中添加以下依赖:
compile 'com.github.LtLei:RxCache:v1.0.0'
在你的Application中进行初始化:
RxCache.init(this);//为RxCache提供Context
也可以使用Builder进行高级初始化:
new RxCache.Builder()
.setDebug(true) //开启debug,开启后会打印缓存相关日志,默认为true
.setConverter(new GsonConverter()) //设置转换方式,默认为Gson转换
.setCacheMode(CacheMode.BOTH) //设置缓存模式,默认为二级缓存
.setMemoryCacheSizeByMB(50) //设置内存缓存的大小,单位是MB
.setDiskCacheSizeByMB(100) //设置磁盘缓存的大小,单位是MB
.setDiskDirName("RxCache") //设置磁盘缓存的文件夹名称
.build();
写入缓存
RxCache.getInstance()
.put("test", "This is data to cache.", 10 * 1000) //key:缓存的key data:具体的数据 time:缓存的有效时间
.compose(RxUtil.<Boolean io_main()) //线程调度
.subscribe(new Consumer<Boolean () {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) Log.d("Cache", "cache successful!");
}
},new Consumer<Throwable () {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
读取缓存
读取缓存时,分为以下几种情况:
若为Gson转换时:
读取基本类型数据,或自定义的javabean数据,或数组数据等一切可以获取.class的数据
RxCache.getInstance()
.get("test",false,String.class) //key:缓存的key update:表示从缓存获取数据强行返回NULL
.compose(RxUtil.<CacheResponse<String io_main())
.subscribe(new Consumer<CacheResponse<String () {
@Override
public void accept(CacheResponse<String stringCacheResponse) throws Exception {
if(stringCacheResponse.getData()!=null)
Log.d("data from cache : "+stringCacheResponse.getData());
}
},new Consumer<Throwable () {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
读取List等无法获取.class的数据,以上基本数据也可以使用此方式
Type type = new TypeToken<List<String (){}.getType();
RxCache.getInstance()
.<List<String get("test",false,type) //由于Type不是类,需要指定泛型
.compose(RxUtil.<CacheResponse<List<String io_main())
.subscribe(new Consumer<CacheResponse<List<String () {
@Override
public void accept(CacheResponse<List<String listCacheResponse) throws Exception {
if(listCacheResponse.getData()!=null)
Log.d("data from cache : "+listCacheResponse.getData().toString());
}
},new Consumer<Throwable () {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
若为Serialize方式时,则统一使用以下方法即可:
RxCache.getInstance()
.<List<String get("test",false) //指定泛型,不再需要传.class或Type
.compose(RxUtil.<CacheResponse<List<String io_main())
.subscribe(new Consumer<CacheResponse<List<String () {
@Override
public void accept(CacheResponse<List<String listCacheResponse) throws Exception {
if(listCacheResponse.getData()!=null)
Log.d("data from cache : "+listCacheResponse.getData().toString());
}
},new Consumer<Throwable () {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
清除指定缓存
RxCache.getInstance()
.remove("testList")
.compose(RxUtil.<Boolean io_main())
.subscribe(new Consumer<Boolean () {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) Log.d("cache data has been deleted.");
}
}, new Consumer<Throwable () {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
清除全部缓存
RxCache.getInstance()
.clear()
.compose(RxUtil.<Boolean io_main())
.subscribe(new Consumer<Boolean () {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) Log.d("All datas has been deleted.");
}
}, new Consumer<Throwable () {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
以上就是本文的全部内容,希望对大家的学习有所帮助。
- phalcon-入门篇6(控制器)
- phalcon-入门篇5(请求与返回)
- phalcon-入门篇2(HelloWord与PhalconTools)
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(一)之语法解析
- phalcon-入门篇4(log日志和session缓存)
- zephir-(5)类型
- zephir-(10)内置函数
- zephir-(9)类和对象2
- 深度学习中的动手实践:在CIFAR-10上进行图像分类
- 数据库中间件 MyCAT源码分析 —— XA分布式事务
- [喵咪Golang(1)]Go语言开篇
- phalcon-进阶篇2(拦截器)
- 【死磕Java并发】—–深入分析synchronized的实现原理
- phalcon-进阶篇1(过滤与清理)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- PHP实现字母数字混合验证码功能
- php+pdo实现的购物车类完整示例
- CentOS7怎么执行PHP定时任务详解
- Linux下PHP+Apache的26个必知的安全设置
- linux中ssh免密通信的实现
- 怎么修改CentOS服务器时间为北京时间
- Laravel5.1 框架控制器基础用法实例分析
- Laravel5.1 框架模型软删除操作实例分析
- Laravel 手动开关 Eloquent 修改器的操作方法
- 怎么测试Linux下tcp最大连接数限制详解
- Laravel 5.1 框架Blade模板引擎用法实例分析
- 使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
- Linux 系统下安装JDK1.8的教程详解
- php学习笔记之字符串常见操作总结
- Laravel5.1 框架模型工厂ModelFactory用法实例分析