美文网首页
RxJava实际应用--->从磁盘/内存缓存中获取缓存数据

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

作者: 谢尔顿 | 来源:发表于2018-07-03 14:46 被阅读20次

1.需求场景

当需要获取数据时,先从本地的磁盘/内存缓存中获取所需数据,如果没有,才通过网络请求向服务器获取数据。我们可以使用操作符concat()和firstElement来实现。

2.具体实现

        final String memoryCache = null;
        final String diskCache = "从磁盘缓存中获取数据";

        //检查内存缓存是否有该数据的缓存
        Observable<String> memory = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                if (memoryCache != null) {
                    e.onNext(memoryCache);
                } else {
                    e.onComplete();
                }
            }
        });

        //检查磁盘缓存是否有该数据的缓存
        Observable<String> disk = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                if (diskCache != null) {
                    e.onNext(diskCache);
                } else {
                    e.onComplete();
                }
            }
        });

        //从网络获取缓存
        Observable<String> network = Observable.just("从网络中获取数据");

        //通concat()合并memory、disk、network 3个被观察者的事件
        //按顺序串连成队列
        Observable.concat(memory, disk, network)
                //通过firstElement(),从串联队列中去除并发送第一个有效事件(Next事件),即依次判断检查memory、disk、network
                .firstElement()
                //firstElement()取出第1个事件 = memory,即先判断内存缓存中有无数据缓存;由于memoryCache = null,所以发送结束事件(视为无效事件)
                //firstElement()继续取出第2个事件 = disk,即先判断磁盘缓存中有无数据缓存,由于diskCache != null,所以发送next事件(视为有效事件)
                //firstElement()已发出第一个有效事件(disk事件),所以停止判断。
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d(Constant.TAG, "最终获取的数据来源 = " + s);
                    }
                });

3.测试结果

07-03 14:46:41.963 14362-14362/com.gjj.frame D/RxJava: 最终获取的数据来源 = 从磁盘缓存中获取数据

相关文章

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

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

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

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

  • Glide学习归纳二 缓存管理

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

  • SDWebImage之缓存策略

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

  • SDWebImage源码阅读--SDImageCache

    一、总览 本类是一个单例对象,主要用作缓存图片数据,包含了内存缓存和磁盘缓存,其中内存缓存了图片对象,磁盘缓存了图...

  • SDWebImage的写小总结!

    //1.下载图片且需要获取下载进度//内存缓存&磁盘缓存 //2.只需要简单获得一张图片,不设置//内存缓存&磁盘...

  • iOS数据存储方式(Core Data/Keycahin/NSU

    前言 在iOS开发中数据存储的方式可以归纳为磁盘缓存和内存缓存:磁盘缓存分为两类:文件、数据库存储。 文件存储:N...

  • Glide缓存汇总

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

  • URL

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

  • 十三章-文件(知识点)

    一、文件基础知识点。 1、缓冲文件系统:从内存向磁盘输出数据,必须先送到内存中的缓存区,装满缓存区后才一起送到磁盘...

网友评论

      本文标题:RxJava实际应用--->从磁盘/内存缓存中获取缓存数据

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