作用

在ReactiveX的一些实现中(如RxJava),Subject充当了桥梁或代理的作用,因为他既是Observable又是Observer。这样他可以订阅其他的Observable,重新发射收到的数据或者发射新的数据。
因为Subject订阅了Observable,会触发Observable开始发射数据。若这个Observable是一个“Cold”的(需要被订阅才开始发射数据),Subject就把他变成了一个“Hot”的Observable。

Subject的种类

AsyncSubject

AscynSubject会在源Observable结束后发射最后一个数据。如果源Observable结束前没有发射数据,那AsyncSubject也不会发射内容直接结束(onComplete)。
image.png

如果源Observable因为错误(onError)而终止,AsyncSubject将不会发射任何数据,只是简单的向下传递这个错误通知。
image.png

BehaviorSubject

当一个Observer订阅BehaviorSubject,他会开始发射源Observable最近发射的数据(如果此时还没有收到任何数据,它会发射一个默认值),然后继续发射其它任何来自源Observable的数据。
image.png
如果源Observable因为错误(onError)而终止,BehaviorSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
image.png

PublishSubject

PublishSubject只会把在订阅发生的时间点之后来自源Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一创建完成就立刻开始发射数据(除非你可以阻止它发生)。因此使用的时候需要注意:在PublishSubject被创建后到有观察者订阅它之前这个时间段内,收到的数据可能会丢失。如果要确保来自源Observable的所有数据都收到,你需要使用Create创建Observable手动进入”Cold”Observable的状态(当所有观察者都已经订阅时才开始发射数据),或者改用ReplaySubject。
image.png
如果源Observable因为错误(onError)而终止,PublishSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
image.png

ReplaySubject

ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。
image.png

MaybeSubject

CompletableSubject

SerializedSubject

SingleSubject

UnicastSubject

参考资料

http://reactivex.io/documentation/subject.html