RxJava2开发小记:先加载缓存再请求网络之简单实现
关于缓存
用户角度:
做客户端,大部分时候都在追求良好的用户体验,缓存,就要达到一个缓兵之计的效果。因为用户永远是“暴躁”的,页面加载要是有缓存先展示出来,用户就会安心很多。这是一种视觉上的舒服,大多数用户并不在乎这个数据从哪来。
开发者角度:
对于客户端程序来说,网络状况是未知而不稳定的,在耗时上面,一次网络请求可能大于本地数据读取好几个数量级。并且,某些及时性不高的数据,并不需要每次都从服务端请求,而是按过期时间来判断是否需要更新缓存,这样也能尽可能地减轻服务器压力。
总结一下上面的开篇废话就是,用户是暴躁的,服务器是脆弱的,唯一坚挺并且逆来顺受的就是客户端了哈哈哈!
正文
目标
望闻问切四部曲:
UI层发起数据获取意愿(望),打听是否能加载缓存(闻),再访问网络进行远程请求(问),最后刷新缓存至本地存储并返回数据给UI层(切)。
药材
读缓存的Observable一个(localDataObservable)
请求网络数据的Observable一个(remoteDataObservable)
关键性的串联操作符contact一个
上药
1 | // 闻:本地缓存 |
1 | // 问:网络数据 |
由于这里是用到了RxJava2+Retrofit2的结构,上述的RetrofitFactory.createRequest().getRemoteData()是对Retrofit进行了简单封装,具体请见:RxJava2开发小记:用CompositeDisposable来“安排”Retrofit网络请求
1 | // 使用contact操作符将两个事件串联起来,当上述的onComplete执行过后,就会开始进行网络请求 |
OK,药到病除,这里基本上是一个模板,以及一些细节处理。
运用到实际业务中还需要大家细细优化。比如说,一些页面可能并不需要每次都串联网络请求,而是需要先判断缓存是否过期,那么就可以在localDataObservable中主动抛出onError来中断事件流,以达到阻止网络请求的目的。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Pig Cat!
评论