添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

今天,我将为大家带来 Rxjava 中的 常见开发应用场景:从磁盘、内存缓存中获取缓存数据 ,希望大家会喜欢。

Carson带你学RxJava系列文章,包括 原理、操作符、应用场景、背压等等 ,请看文章: Android:这是一份全面 & 详细的RxJava学习指南

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的实际开发需求场景:从磁盘 / 内存缓存中 获取缓存数据
  • Carson带你学RxJava系列文章:

入门
Carson带你学Android:这是一篇清晰易懂的Rxjava入门教程
Carson带你学Android:这是一份面向初学者的RxJava使用指南
Carson带你学Android:RxJava2.0到底更新了什么?(含使用建议)
原理
Carson带你学Android:图文解析RxJava原理
Carson带你学Android:手把手带你源码分析RxJava
使用教程(操作符)
Carson带你学Android:RxJava操作符教程
Carson带你学Android:RxJava创建操作符
Carson带你学Android:RxJava功能性操作符
Carson带你学Android:RxJava过滤操作符
Carson带你学Android:RxJava组合/合并操作符
Carson带你学Android:RxJava变换操作符
Carson带你学Android:RxJava条件/布尔操作符
应用
Carson带你学Android:什么时候应该使用Rxjava?(开发场景汇总)
Carson带你学Android:RxJava线程控制(含实例讲解)
Carson带你学Android:图文详解RxJava背压策略
Carson带你学Android:RxJava、Retrofit联合使用汇总(含实例教程)
Carson带你学Android:优雅实现网络请求嵌套回调
Carson带你学Android:网络请求轮询(有条件)
Carson带你学Android:网络请求轮询(无条件)
Carson带你学Android:网络请求出错重连(结合Retrofit)
Carson带你学Android:合并数据源
Carson带你学Android:联想搜索优化
Carson带你学Android:功能防抖
Carson带你学Android:从磁盘/内存缓存中获取缓存数据
Carson带你学Android:联合判断

欢迎关注Carson_Ho的CSDN博客 与 公众号!

博客链接:https://carsonho.blog.csdn.net/

请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

前言Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程 RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求今天,我将为大家带来 Rxjava中的常见开发应用场景:从磁盘、内存缓存中获取缓
1.简介 现在android应用不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)比较多。现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响。当然,我想,向百度美拍这样的应用,必然也有其内部的图片缓存策略。总之,图片缓存是很重要而且是必须的。 2.图片缓存的原理 实现图片缓存也不难,需要有相应的cache策略。这里我采用 内存-文件-网络 三层cache机制,其内存缓存包括强引用缓存和软引
在资讯类应用为了优化用户体验,一般会使用缓存数据。以下代码就是使用rxjava 同时获取网络和缓存数据。网络数据可以覆盖缓存数据缓存数据无法覆盖网络数据。网络出错不会影响缓存的显示,缓存出错不会影响网络的显示。两则同时出错,则会显示网络错误。使用的时候也很简单。只需要一行代码。 RxDataUtil.getData(net, cache) 和网上已有的方法相比,这个方法更好理解。没用特别复杂的操作符。而且没用bug。 下面这篇文章如果网络和缓存都出错,下游将接受不到事件,界面会一直处于load
先前有写过基于Rxjava+Retrofit获取网络数据,有时数据源来自本地数据库,读写数据库也是耗时操作。既然mvp+Rxjava的封装适用于网络数据,是否适用于数据库的操作呢? 这几天也查看了相关的资料,没有看到一针见血的文章。细细看来,其实也很简单。只需要改一行代码就可以搞定! Retrofit的封装过程可以参考先前的文章:安卓框架搭建之MVP+Retrofit+RxJava基础:,这里先
//会首先从缓存获取结果,其次数据库,然后网络 Observable.concat(getFromCache(), getFromDB(), getFromNet()) .firstElement() //注意是取第一个返回的结果,不是第一个方法的结果 .toObse...
关于缓存 用户角度: 做客户端,大部分时候都在追求良好的用户体验,缓存,就要达到一个缓兵之计的效果。因为用户永远是“暴躁”的,页面加载要是有缓存先展示出来,用户就会安心很多。这是一种视觉上的舒服,大多数用户并不在乎这个数据从哪来。 开发者角度: 对于客户端程序来说,网络状况是未知而不稳定的,在耗时上面,一次网络请求可能大于本地数据读取好几个数量级。并且,某些及时性不高的数据,并不需要每次都从服务端...
int cacheSize = 10 * 1024 * 1024; // 10 MiB final String CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/okcache"; File cacheDirectory = new F...
Retrofit + rxJava实现三级缓存前言平时加载数据的时候,大多都用到缓存,即取数据的顺序为:内存->硬盘->网络。rxJava实现三级缓存的需求主要用到两个操作符:concat和first.concatconcat同名的方法有很多,由于是实现三级缓存,所以这里使用的是3个参数的concat。先来看官方说明: Returns an Observable that emits the i