RxRelay - 没有onComplete和onError的Subject

271 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Subject

Subject是某种桥接或者代理, 在某些ReactiveX的实现中可用, 它可以同时作为ObservableObserver使用. 因为是个Observer, 所以它能够订阅一个或者多个Observable; 而且因为它是个Observable, 它能够将自己观测的数据项重新发送出去, 而且它也能够发送新的数据项.

Subject的变体

Subject有4个变体, 专门为特定的用例而设计. 但并不是在所有的实现中都有它们4个的实现.

这4个变体分别是AsyncSubject, BehaviorSubject, ReplaySubjectPublishSubject. 更多信息请查看这里.

Relay

Relay是一个RxJava类型, 它也可以同时作为ObservableConsumer来工作. 而且它相似于Subject, 却没有调用onCompleteonError的能力.

Subjects用于桥接非Rx API和Rx API的之间的间隔. 但它们以一种有害的方式持有状态: 当它们接收到onComplete或者onError时, 它们将不再能够移动数据. 这是Observable的协议. 有时候这是期待的行为, 但大多数情况下不是.

Relay是没有onCompleteonError状态的Subjects, 所以它在将非Rx API桥接到Rx API时, 是没有这些终止状态的.

Relay仅仅是没有上述属性的Subject. 它允许你能够轻易地将非Rx API桥接到Rx API, 却不必担心意外地触发终止状态.

随着十元的代码迁移到Reactive, 对于Subject和Relay的需求应该会最终消失. 在这个迁移期间, 或者为了迅速地适配非Rx API, Relay提供了Subject的方便之处, 同时不用担心终止事件行为的有状态性.

下载

Gradle:

implementation 'com.jakewharton.rxrelay3:rxrelay:3.0.1'

Maven:

<dependency>
  <groupId>com.jakewharton.rxrelay3</groupId>
  <artifactId>rxrelay</artifactId>
  <version>3.0.1</version>
</dependency>

Relay的变体

Relay有3个变体, 它们分别是BehaviorRelay, PublishRelayReplayRelay. 它们是对应版本的没有onCompleteonErrorSubject. 它们和对应的Subject有相似的行为.

更多关于RxRelay的信息请查看这里.