由rxjava中Flowable注释,引出的Reactive-Streams相关知识

由rxjava中Flowable注释,引出的Reactive-Streams相关知识

  • 起因
  • 相关知识点
    • 一、Reactive-Streams
      • 参考资料
      • 学习总结
    • 二、背压(Backpressure)
      • 参考资料
      • 学习总结
    • 三、Reactive-Streams四个接口
      • 发布者Publisher
      • 订阅者Subscriber
      • 订阅对象Subscription
      • 处理者Processor
    • 四、Rxjava对Reactive-Streams的使用

起因

最近,在看项目中的代码,看到使用rxjava的Flowable类,点进源文件,发现上方的注释中,提到了Reactive-Streams(响应式流),本着不懂就学的原则,对Reactive-Streams进行了学习。

如果更准确的了解Reactive-Streams的话,可以看参考资料。这里只是我自己的理解,让我自己看的,可能会有偏差,请以资料为准。

相关知识点

一、Reactive-Streams

参考资料

https://www.reactive-streams.org
https://blog.csdn.net/wudaoshihun/article/details/83070086

学习总结

Reactive-Streams是一套为处理异步数据流而提供的非阻塞的背压标准

这里有三个重要点,异步数据流、非阻塞、背压。前两个不用说,这里第三个“背压”就是我不懂的了,所以我下面又去查找了下“背压(Backpressure)”的资料。下面会有介绍。

jdk9提供了“java.util.concurrent.Flow”类,提供了实现。

Reactive-Streams实现了四个接口,分别是“发布者Publisher”、“订阅者Subscriber”、“订阅对象Subscription”、“处理者Processor”,具体介绍完背压后在总结。

二、背压(Backpressure)

参考资料

https://www.zhihu.com/question/49618581
上面的抛物线大佬给出的回答,解决了我很多的疑惑

学习总结

Backpressure 其实是一种现象:在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现

溢出后会抛弃上游生产的多余数据,即丢弃新事件

这里需要说下的是,在Flowable中的Buffer的size默认为128

三、Reactive-Streams四个接口

发布者Publisher

rxjava中Flowable实现了这个接口
它是数据项发布者、生产者。
subscribe方法功能是注册订阅者Subscriber。

public interface Publisher<T> {
 public void subscribe(Subscriber<? super T> s);
}

订阅者Subscriber

它是数据项订阅者、消费者
订阅者有四个事件方法,分别在开启订阅、接收数据、发生错误和数据传输结束时被调用。
只有在onSubscribe中的Subscription调用request方法后,Publisher才会发送信息,并调用onNext方法

public interface Subscriber<T> {
    public void onSubscribe(Subscription s);
    
    public void onNext(T t);

    public void onError(Throwable t);

    public void onComplete();
}

订阅对象Subscription

Subscription是Publisher与Subscriber之间的交互对像。
Publisher通过调用Subscriber的onSubscribe方法将Subscription数据传送给Subscriber。
Subscriber通过Subscription的request方法请求n条数据,此时会触发Subscriber的onNext方法。
Subscription只能被Subscriber使用一次。
其中n不能大于Long.MAX_VALUE。

public interface Subscription {

	public void request(long n);

	public void cancel();
}

处理者Processor

处理者即使订阅者也是发布者,
主要作用是用于在发布者和订阅者之间转换数据格式,把发布者的T类型数据转换为订阅者接受的R类型数据。
处理者作为数据转换的中介不是必须的。

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}

四、Rxjava对Reactive-Streams的使用

在当前的源码中可以看到Rxjava使用的Reactive-Streams接口,来自于reactive-streams-1.0.0-sources.jar包。
基本使用(以下为演示逻辑,用的是最简单的代码,在自己的项目中最好不要这么写):

Flowable.just(this)
        .subscribe(new Subscriber<SettingActivity>() {
          @Override
          public void onSubscribe(Subscription s) {
            Logger.getLogger().e("onSubscribe");
            s.request(Integer.MAX_VALUE);
          }

          @Override
          public void onNext(SettingActivity settingActivity) {
            Logger.getLogger().e("onNext" );
          }

          @Override
          public void onError(Throwable t) {
            Logger.getLogger().e("onError");
          }

          @Override
          public void onComplete() {
            Logger.getLogger().e("onComplete");
          }
        });

其中,Flowable是实现的Publisher接口,just方法创建实例。通过subscribe方法调用Subscriber。其中Subscriber的onSubscribe方法一定会被调用。只有调用s.request(Integer.MAX_VALUE)方法,才会调用后续的onNext、onError、onComplete方法。

在RxJava中其实还有其他的类继承了这些接口,并进行了进一步的封装。不过在这里就不介绍了,以后有机会在写吧

你可能感兴趣的:(#,Android零碎知识学习总结,android)