美文网首页Android开发Rxjava学习Android知识
Android RxJava 实际应用讲解:从磁盘 / 内存缓存

Android RxJava 实际应用讲解:从磁盘 / 内存缓存

作者: Carson带你学安卓 | 来源:发表于2017-11-06 08:41 被阅读3442次

    前言

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

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

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

    目录

    示意图

    1. 需求场景

    示意图

    2. 功能说明

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


    示意图

    3. 具体实现

    • 详细请看代码注释
    // 该2变量用于模拟内存缓存 & 磁盘缓存中的数据
            String memoryCache = null;
            String diskCache = "从磁盘缓存中获取数据";
            
            /*
             * 设置第1个Observable:检查内存缓存是否有该数据的缓存
             **/
            Observable<String> memory = Observable.create(new ObservableOnSubscribe<String>() {
                @Override
                public 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>() {
                @Override
                public 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>() {
                        @Override
                        public void accept( String s) throws Exception {
                            Log.d(TAG,"最终获取的数据来源 =  "+ s);
                        }
                    });
    
    • 测试结果
    示意图

    4. Demo地址

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


    5. 总结

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

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

    相关文章阅读

    Android RxJava 实际应用讲解:合并数据源
    Android RxJava 实际应用讲解:从磁盘 / 内存缓存中 获取缓存数据
    Android RxJava 实际应用讲解:联合判断
    Android RxJava:细说 线程控制(切换 / 调度 )(含Retrofit实例讲解)
    Android RxJava 实际应用讲解:网络请求出错重连(结合Retrofit)


    欢迎关注Carson_Ho的简书!

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

    相关文章

      网友评论

      • L_Xian:如何加入更新缓存的时机
      • inke:不错
      • 我一定会学会:firstElement这个方法,在你的系列里面好像没有出现过
        像鸟一样飞:刚刚验证了一下,concat不带有onCompleted,有了first()之后会带上一个onCompleted:flushed:
      • 命若弦_T:作者 现在会RX 能找什么样的安卓开发工作
        kakaxicm:现在高级开发好像大部分要求熟悉自定义组件和开源框架设计原理等等,自己对号入座就知道啦
      • 787ced935c4a:这种场景可以使用 zip() 操作符来合并吗?
      • 心有阳光666:很不错,受益匪浅😃

      本文标题:Android RxJava 实际应用讲解:从磁盘 / 内存缓存

      本文链接:https://www.haomeiwen.com/subject/usccsxtx.html