前言

  • Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Github截图

如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程

  • RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求
  • 今天,我将为大家带来 Rxjava中的常见开发应用场景:从磁盘、内存缓存中获取缓存数据 ,希望大家会喜欢。
  1. 本系列文章主要基于 Rxjava 2.0
  2. 接下来的时间,我将持续推出 AndroidRxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!
示意图

目录

示意图

1. 需求场景

示意图
  • 注:关于 Rxjava中的创建操作符firstElement()concat()的使用请看文章
    Android RxJava:最基础的操作符详解 - 创建操作符
    Android RxJava:组合 / 合并操作符 详细教程

2. 功能说明

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


示意图

3. 具体实现

  • 详细请看代码注释
// 该2变量用于模拟内存缓存 & 磁盘缓存中的数据        String memoryCache = null;        String diskCache = "从磁盘缓存中获取数据";                /*         * 设置第1个Observable:检查内存缓存是否有该数据的缓存         **/        Observable memory = Observable.create(new ObservableOnSubscribe() {            @Override            public void subscribe(ObservableEmitter emitter) throws Exception {                // 先判断内存缓存有无数据                if (memoryCache != null) {                    // 若有该数据,则发送                    emitter.onNext(memoryCache);                } else {                    // 若无该数据,则直接发送结束事件                    emitter.onComplete();                }            }        });        /*         * 设置第2个Observable:检查磁盘缓存是否有该数据的缓存         **/        Observable disk = Observable.create(new ObservableOnSubscribe() {            @Override            public void subscribe(ObservableEmitter emitter) throws Exception {                // 先判断磁盘缓存有无数据                if (diskCache != null) {                    // 若有该数据,则发送                    emitter.onNext(diskCache);                } else {                    // 若无该数据,则直接发送结束事件                    emitter.onComplete();                }            }        });        /*         * 设置第3个Observable:通过网络获取数据         **/        Observable 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() {                    @Override                    public void accept( String s) throws Exception {                        Log.d(TAG,"最终获取的数据来源 =  "+ s);                    }                });
  • 测试结果
示意图

4. Demo地址

Carson_Ho的Github地址 = RxJava2实战系列:从磁盘 / 内存缓存中 获取缓存数据


5. 总结

  • 本文主要讲解了 Rxjava的实际开发需求场景:从磁盘 / 内存缓存中 获取缓存数据
  • 下面我将结合 实际场景应用 & Rxjava的相关使用框架(如RetrofitEventbus ,继续对 AndroidRxjava 的实际开发需求场景进行深入讲解
示意图

感兴趣的同学可以继续关注本人运营的Wechat Public Account

  • 我想给你们介绍一个与众不同的Android微信公众号(福利回赠)
  • 我想邀请您和我一起写Android(福利回赠)

请点赞!因为你的鼓励是我写作的最大动力!

相关文章阅读

  • 操作符使用
    Android:这是一篇 清晰 & 易懂的Rxjava 入门教程
    Android RxJava:最基础的操作符详解 - 创建操作符
    Android RxJava:图文详解 变换操作符
    Android RxJava:组合 / 合并操作符 详细教程
    Android RxJava:功能性操作符 全面讲解
  • 实际应用讲解
    Android RxJava 实际应用讲解:(无条件)网络请求轮询
    Android RxJava 实际应用讲解:(有条件)网络请求轮询
    Android RxJava 实际应用讲解:网络请求嵌套回调
    Android RxJava 实际应用讲解:合并数据源
    Android RxJava 实际应用讲解:从磁盘 / 内存缓存中 获取缓存数据
    Android RxJava 实际应用讲解:联合判断
    Android RxJava:细说 线程控制(切换 / 调度 )(含Retrofit实例讲解)
    Android RxJava 实际应用讲解:网络请求出错重连(结合Retrofit)

欢迎关注Carson_Ho的!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. 浅析LruCache原理
  5. Android(安卓)studio APP开发 ListView控件的建立和使用
  6. Google 官方推出应用开发架构指南
  7. Android简单使用SharedPreferences和 SQLite数据库实现数据存储
  8. android开发实例02:列表字母索引与过滤检索
  9. android interview 2

随机推荐

  1. android 利用重力感应监测手机摇晃,做出相
  2. robotium获取本地文档内容
  3. AndroidUi(1)-直线
  4. ubuntu 使用android studio 查看android(
  5. Android开发的小细节
  6. MTK 平台(MTK6573)马达驱动
  7. android解决坚屏拍照和保存图片旋转90度
  8. 自定义android preference组件
  9. arm-eabi-addr2line工具
  10. Android自定义对话框(Dialog)