本文正如标题所说的用rxjava实现数据的三级缓存分别为内存,磁盘,网络,刚好最近在看Android源码设计模式解析与实战(受里面的ImageLoader的设计启发),我把代码放到了我的hot项目中。github地址
使用concat()和first()的操作符
用concat()和first()的操作符来实现,这是我在看Android源码设计模式解析与实战,作者在第一章的时候就介绍ImageLoader的设计。在内存中存储的方式LruCache来实现的,磁盘存储的方式就是序列化存储。
定义一个接口
|
|
2.内存存储的实现
|
|
磁盘存储的实现
|
|
isCacheDataFailure()方式中就是判断当前的数据是否失效,我是根据当前的网络状况来分wifi状况和非wifi状况,wifi状态下数据过期时间比较短,其他状态过期时间比较长。
CacheLoader的设计
|
|
网络获取的NetworkCache
|
|
6.接下来看怎么使用
一定要给个key,我是根据key来获取数据的,还要就是给个类型。但是这个我设计的这个缓存还是不是很理想,接来下想要实现的就是在传入的时候类的class都不用给明,要是有好的实现的方式,欢迎告诉我。
使用BehaviorSubject
BehaviorSubject的实现方法,废话不多说直接上代码
|
|
其中最主要的是subscriptionData()这个方法,就是先判断 cache是否存在要是存在的话就返回内存中数据,再去判断磁盘数据是否存在,如果存在就返回,要是前面两种都不存在的时候,再去网络中获取数据。还有最重要的是当你从网络获取数据的时候要记得保存在内存中和保存在磁盘中,在磁盘获取数据的时候把它赋值给内存。