RxJava2 五大重要角色介绍

本文详细介绍了RxJava2的五大基类Flowable、Observable、Single、Completable和Maybe,包括各自的特性和使用场景。Flowable支持背压策略,Observable不支持,而Single、Completable和Maybe则分别适用于单个值的发射。文中还通过官方图解和实例帮助理解这些概念。
摘要由CSDN通过智能技术生成

 

目录

RxJava2 的5大基类及本章学习结构图

1、Flowable

1.1、Flowable简介

1.2、Flowable官方图解

1.3、Backpressure

2、Observable

2.1、Observable简介

2.2、Observable官方图解

2.3、Flowable和Observable对比

2.4、形象理解ObservableSource和Publisher有何异同

3、Single

3.1、Single简介

3.2、Single与Observable的区别

3.3、Single官方图解

4、Completable

4.1、Completable简介

4.2、Completable官网图解

4.3、Completable示例

5、Maybe

5.1、Maybe简介

5.2、Maybe官方图解

5.3、Maybe示例

6、总结:


开篇

开始学习RxJava的时候忘记所有,仅仅就学习RxJava,单独看待,不需要和Retrofit等等其它库结合使用,当我们明白RxJava的操作符等一些列api怎么使用在什么场景下使用后再来结合Retrofit来进行网络请求等,这样或许会更加清晰点。

 

RxJava2 的5大基类及本章学习结构图

 

1、Flowable

1.1、Flowable简介

Flowable类,用于实现Reactive-Streams模式,并提供工厂方法,中间运算符以及使用反应式数据流的能力。

Reactive-Streams使用Flowable运行,Flowable实现了Publishers。因此,许多运算符直接接受Publishers,并允许与其他Reactive-Streams的实现进行直接交互操作

public abstract class Flowable<T> implements Publisher<T>

Flowable为操作符提供128个元素的默认缓冲区大小,可通过bufferSize() 方法获取,可通过系统参数rx2.buffer-size全局覆盖。但是大多数运算符都有重载,允许显式设置其内部缓冲区大小。

    /** The default buffer size. */
    static final int BUFFER_SIZE;
    static {
        BUFFER_SIZE = Math.max(16, Integer.getInteger("rx2.buffer-size", 128));
    }

    /**
     * Returns the default internal buffer size used by most async operators.
     * <p>The value can be overridden via system parameter {@code rx2.buffer-size}
     * <em>before</em> the Flowable class is loaded.
     * @return the default internal buffer size.
     */
    public static int bufferSize() {
        return BUFFER_SIZE;
    }

 

1.2、Flowable官方图解

1)看到上图有点疑问,不是在说Flowable嘛,怎么图解里的说明是Observable呢?

2)其实在官方文档里面Flowable和Observable都使用的是上面这个图解,因此这两个类肯定是提供相似功能,既然是相似,那么这幅图就是他们的共性,那不同的地方是什么呢?

不同之处是:Flowable支持Backpressure,Observable不支持Backpressure;

3)Backpressure什么是?

看下面1.3节

 

 

1.3、Backpressure

Backpressure中文翻译过来是背压,这里推荐一篇很好的关于Backpressure说明的博客:关于RxJava最友好的文章——背压(Backpressure)

下面关于背压的说明是出自拉丁吴博客的内容,写的很通俗易懂

RxJava是一个观察者模式的架构,当这个架构中被观察者(Observable)和观察者(Subscriber)处在不同的线程环境中时,由于者各自的工作量不一样,导致它们产生事件和处理事件的速度不一样,这就会出现两种情况:

  • 被观察者产生事件慢一些,观察者处理事件很快。那么观察者就会等着被观察者发送事件,(好比观察者在等米下锅,程序等待,这没有问题)
  • 被观察者产生事件的速度很快,而观察者处理很慢。那就出问题了,如果不作处理的话,事件会堆积起来,最终挤爆你的内存,导致程序崩溃。(好比被观察者生产的大米没人吃,堆积最后就会烂掉)

下面我们用代码演示一下这种崩溃的场景:

//被观察者在主线程中,每1ms发送一个事件
Observable.interval(1, TimeUnit.MILLISECONDS)
                //.subscribeOn(Schedulers.newThread())
                //将观察者的工作放在新线程环境中
                .observeOn(Schedulers.newThread())
                //观察者处理每1000ms才处理一个事件
                .subscribe(new Action1<Long>() {
                      @Override
                      public void call(Long aLong) {
                          try {
                              Thread.sleep(1000);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          Log.w("TAG","---->"+aLong);
                      }
                  });

拉丁吴对Backpressure的定义是:

背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略

简而言之,背压是流速控制的一种策略

需要强调两点:

  • 背压策略的一个前提是异步环境,也就是说,被观察者和观察者处在不同的线程环境中。
  • 背压(Backpressure)并不是一个像flatMap一样可以在程序中直接使用的操作符,他只是一种控制事件流速的策略。

关于背压(Backpressure)的解释拉丁吴说的很清楚了,要了解更多关于这方面的信息可以移步他的博客:关于RxJava最友好的文章——背压(Backpressure)

 

2、Observable

2.1、Observable简介

Observable类是不支持背压的,Observable是Reactive的一个抽象基类,Observable提供工厂方法,中间运算符以及消费同步和/或异步数据流的功能。

Observable类中的多数运算符接受一个或者多个ObservableSource,ObservableSource是非背压的基本接口&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值