本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Subject
Subject是某种桥接或者代理, 在某些ReactiveX的实现中可用, 它可以同时作为Observable和Observer使用. 因为是个Observer, 所以它能够订阅一个或者多个Observable; 而且因为它是个Observable, 它能够将自己观测的数据项重新发送出去, 而且它也能够发送新的数据项.
Subject的变体
Subject有4个变体, 专门为特定的用例而设计. 但并不是在所有的实现中都有它们4个的实现.
这4个变体分别是AsyncSubject, BehaviorSubject, ReplaySubject和PublishSubject. 更多信息请查看这里.
Relay
Relay是一个RxJava类型, 它也可以同时作为Observable和Consumer来工作. 而且它相似于Subject, 却没有调用onComplete和onError的能力.
Subjects用于桥接非Rx API和Rx API的之间的间隔. 但它们以一种有害的方式持有状态: 当它们接收到onComplete或者onError时, 它们将不再能够移动数据. 这是Observable的协议. 有时候这是期待的行为, 但大多数情况下不是.
Relay是没有onComplete和onError状态的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, PublishRelay和ReplayRelay. 它们是对应版本的没有onComplete和onError的Subject. 它们和对应的Subject有相似的行为.
更多关于RxRelay的信息请查看这里.