RxJava的Subject

Subject即可以是一个Observer也可以是一个Observerable,它是连接Observer和Observable的桥梁。因此,Subject可以被理解为Subject = Observable + Observer。RxJava提供了以下4中Subject。
1.PublishSubject
 PublishSubject只会把在订阅发生的时候点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一个创建完成就立刻开始发射数据,因此这里会有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来之原始Observable的所有数据都被分发,则可以当所有观察者都已经订阅时才开始发射数据,或者改用ReplaySubject。
2.BehaviorSubject
 当Observer订阅BehaviorSubject时,它开始发射原始Observable最近发生的数据。如果此时没有收到任何数据,它发射一个默认值,然后继续发射其它任何来自原始Observable的数据。如果原始的Obserable因为发生一个错误而终止,BehaviorSubject将不会发射任何数据,但是会向Observer传递一个异常通知。
3.ReplaySubject
不管Observer何时订阅ReplaySubject,ReplaySubject均会发射所有来之Observable的数据给Observer。有不同类型的ReplaySubject,它们用于限定Replay的范围,例如设定Buffer的具体大小,或者设定具体的时间范围。如果使用ReplaySubject作为Observer,注意不要在多个线程中调用onNext,onCompleted和onError发法。这可能会导致顺序错乱,并且违反了Observer规则。
4.AsyncSubject
当Observabel完成,AsyncSubject只会发射来自原始Observable的最后一个数据。如果原始Observable因为发生了错误而终止,AsyncSubject将不会发射任何数据,但是会向Observer传递一个通知。

你可能感兴趣的:(RxJava的Subject)