美文网首页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的简书!

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

相关文章

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

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

  • RxJava实际应用--->从磁盘/内存缓存中获取缓存数据

    1.需求场景 当需要获取数据时,先从本地的磁盘/内存缓存中获取所需数据,如果没有,才通过网络请求向服务器获取数据。...

  • Android 两种缓存方式介绍

    Android缓存分为内存缓存和磁盘缓存。 内存缓存(LruCache) 在早期的 Android 2.x 时代,...

  • Android缓存机制——一般存储实现

    一、Android缓存机制 Android缓存分为内存缓存和文件缓存(磁盘缓存)。在早期,各大图片缓存框架流行之前...

  • Rxjava实现三级缓存的两种方式

    本文正如标题所说的用rxjava实现数据的三级缓存分别为内存,磁盘,网络,刚好最近在看Android源码设计模式解...

  • Glide缓存汇总

    Glide缓存汇总 1、Glide有内存缓存和磁盘缓存 2、缓存策略 3、内存缓存 4、磁盘缓存 5、缓存位置和大...

  • URL

    URL加载系统:缓存、Cookies与协议 缓存: URL为请求提供了基于磁盘缓存和内存缓存,缓存减少了应用对网络...

  • Glide学习归纳二 缓存管理

    Glide的缓存分成两个缓存,一个是内存缓存,一个是磁盘缓存 内存缓存的主要作用是防止应用重复将图片数据读取到内存...

  • YYCache 源码学习总结

    YYCache 内存分为内存缓存和磁盘缓存 内存缓存 1.内存缓存实现通过CFMutableDictionaryR...

  • SDWebImage之缓存策略

    目录 取值 - 内存缓存 取值 - 磁盘缓存 存值 - 内存/磁盘缓存 简介 本章节只是对SDWebImage中内...

网友评论

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

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

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