1. 需求场景

2. 功能说明

对于从磁盘 / 内存缓存中 获取缓存数据 的功能逻辑如下:

3. 具体实现

  • 详细请看代码注释
// 该2变量用于模拟内存缓存 & 磁盘缓存中的数据String memoryCache = null;String diskCache = "从磁盘缓存中获取数据";/** 设置第1个Observable:检查内存缓存是否有该数据的缓存**/Observable<String> memory = Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> emitter) throws Exception {// 先判断内存缓存有无数据if (memoryCache != null) {// 若有该数据,则发送emitter.onNext(memoryCache);} else {// 若无该数据,则直接发送结束事件emitter.onComplete();}}});/** 设置第2个Observable:检查磁盘缓存是否有该数据的缓存**/Observable<String> disk = Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> emitter) throws Exception {// 先判断磁盘缓存有无数据if (diskCache != null) {// 若有该数据,则发送emitter.onNext(diskCache);} else {// 若无该数据,则直接发送结束事件emitter.onComplete();}}});/** 设置第3个Observable:通过网络获取数据**/Observable<String> network = Observable.just("从网络中获取数据");// 此处仅作网络请求的模拟/** 通过concat() 和 firstElement()操作符实现缓存功能**/// 1. 通过concat()合并memory、disk、network 3个被观察者的事件(即检查内存缓存、磁盘缓存 & 发送网络请求)//    并将它们按顺序串联成队列Observable.concat(memory, disk, network)// 2. 通过firstElement(),从串联队列中取出并发送第1个有效事件(Next事件),即依次判断检查memory、disk、network.firstElement()// 即本例的逻辑为:// a. firstElement()取出第1个事件 = memory,即先判断内存缓存中有无数据缓存;由于memoryCache = null,即内存缓存中无数据,所以发送结束事件(视为无效事件)// b. firstElement()继续取出第2个事件 = disk,即判断磁盘缓存中有无数据缓存:由于diskCache ≠ null,即磁盘缓存中有数据,所以发送Next事件(有效事件)// c. 即firstElement()已发出第1个有效事件(disk事件),所以停止判断。// 3. 观察者订阅.subscribe(new Consumer<String>() {@Overridepublic void accept( String s) throws Exception {Log.d(TAG,"最终获取的数据来源 =  "+ s);}});
  • 测试结果

Android RxJava操作符的学习---组合合并操作符---从磁盘或内存缓存中获取缓存数据相关推荐

  1. Android RxJava操作符的学习---组合合并操作符---联合判断多个事件

    1. 需求场景 需要同时对多个事件进行联合判断 如,填写表单时,需要表单里所有信息(姓名.年龄.职业等)都被填写后,才允许点击 "提交" 按钮 2. 功能说明 此处采用 填写表单 ...

  2. Android RxJava操作符的学习---组合 / 合并操作符

    3.3 组合 / 合并操作符 3.3.1. 作用 组合 多个被观察者(Observable) & 合并需要发送的事件 应用场景 组合多个被观察者 合并多个事件 发送事件前追加发送事件 统计发送 ...

  3. Android RxJava操作符的学习---组合合并操作符---合并数据源并展示

    1. 需求场景 2. 功能说明 即,同时向2个数据源获取数据 -> 合并数据 -> 统一展示到客户端 3. 具体实现 此处采用Merge() & Zip()操作符进行讲解,其中: ...

  4. Android中获取缓存大小和清除缓存功能

    前言 本篇博客要给大家分享的如何获取应用缓存的大小和清除缓存的功能,我们知道我们应用当中经常会产生一些数据,比如图片的缓存,数据库文件,配置文件等等.我们开发产品的时候,可能会有这样的一个需求清除应用 ...

  5. Android RxJava操作符的学习---条件 / 布尔操作符

    3.6 条件 / 布尔操作符 3.6.1. 作用 通过设置函数,判断被观察者(Observable)发送的事件是否符合条件 3.6.2. 类型 RxJava2中,条件 / 布尔操作符的类型包括: 下面 ...

  6. 学习Spring Boot:(十九)Shiro 中使用缓存

    前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...

  7. Android RxJava应用:优雅实现网络请求轮询(无条件)

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...

  8. Android :RxJava学习笔记之合并操作符

    RxJava --合并操作符 合并操作符 1.concat() / concatArray() 2.merge() / mergeArray() 3.concatDelayError() / merg ...

  9. RxJava进阶一(创建类操作符)

    RxJava进阶一(创建类操作符) RxJava进阶二(转换类操作符) RxJava进阶三(过滤类操作符) RxJava进阶四(组合类操作符) 前面已经对RxJava原理进行介绍,相信大家对于RXJa ...

最新文章

  1. 春天来了,我也发“芽”了!
  2. 一文读懂 Shell 中各种括号的作用
  3. anaconda mac安装
  4. 在MinGW下使用DShow的方法
  5. Spring对事物的实现
  6. mysql内部时区_一文解决MySQL时区相关问题
  7. PHP中通过Web 执行C/C++应用程序
  8. elementUI使用之table表格如何给行元素添加点击事件
  9. 【转】Android 全屏方案(隐藏NavigationBar)
  10. 读书印记 - 《我们人类的基因:全人类的历史和未来》
  11. python 什么意思_Python中冒号等于(:=)是什么意思?
  12. 亚马逊云科技 Build On -serverless商店行业应用实践
  13. 10.23训练赛补题
  14. Android开发者如何搭建服务器
  15. spring cloud服务之间的调用Fegin
  16. 货仓选址问题——Python
  17. 单片机编程中,如何用串口调试助手直接打印出十进制数
  18. git创建分支并推到远端
  19. 单页下单商城源码+搭建教程
  20. 昌泰纺织的“做事即是做人”激励机制

热门文章

  1. 升级win10后以太网总是断开连接的解决办法,针对Broadcom NetLink (TM) Gigabit Ethernet网卡
  2. WINDOWS关于注册表
  3. 利用SelectPdf插件将网页生成PDF
  4. 【BZOJ3309】DZY Loves Math
  5. 一个小老板的生意经,别人都不赚钱的时候凭什么他还能继续大赚?
  6. 334个地级市名单_334个地级市的“基层”演出,李志说“如果我死了,得留下点什么”...
  7. Apache Flink
  8. 按下亮 松开灭 c语言程序,MSP430G2452按键控制P1.0口LED灯亮灭
  9. 6款Windws电脑必备软件,大大提高工作效率!
  10. 简话消融研究是什么意思