最近,在看项目中的代码,看到使用rxjava的Flowable类,点进源文件,发现上方的注释中,提到了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”,具体介绍完背压后在总结。
https://www.zhihu.com/question/49618581
上面的抛物线大佬给出的回答,解决了我很多的疑惑
Backpressure 其实是一种现象:在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现。
溢出后会抛弃上游生产的多余数据,即丢弃新事件。
这里需要说下的是,在Flowable中的Buffer的size默认为128。
rxjava中Flowable实现了这个接口
它是数据项发布者、生产者。
subscribe方法功能是注册订阅者Subscriber。
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
它是数据项订阅者、消费者
订阅者有四个事件方法,分别在开启订阅、接收数据、发生错误和数据传输结束时被调用。
只有在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是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();
}
处理者即使订阅者也是发布者,
主要作用是用于在发布者和订阅者之间转换数据格式,把发布者的T类型数据转换为订阅者接受的R类型数据。
处理者作为数据转换的中介不是必须的。
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
在当前的源码中可以看到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中其实还有其他的类继承了这些接口,并进行了进一步的封装。不过在这里就不介绍了,以后有机会在写吧