Rxjava学习(2)-Subject

https://www.jianshu.com/p/f016f707a740

1.AsyncSubject

AsyncSubject只会发射来自原始Observable的最后一个数据。如果原始的Observable因为发生了错误而终止,AsyncSubject将不会发射任何数据,但是会向Observer传递一个异常通知。只发射onComplete()之前的一个事件给所有Observer,技术Observer在onComplete()发射之后注册也能收到。

2.BegaviorSubject

BehaviorSubject开始发射原始Observable最近发射的数据。如果此时还没有收到任何数据,它会发射一个默认值,然后继续发射其他任何来自原始Observable的数据。如果原始的Observable因为发生了一个错误而终止,BehaviorSubject将不会发射任何数据,但是会向Observer传递一个异常通知。

3.PublishSubject

PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一创建完成就立刻开始发射数据,因此这里会有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来自原始Observable 的所有数据都被分发,则可以当所有观察者都已经订阅时,才开始发射数据,或者改用ReplaySubject。

4.ReplaySubject

不管Observer何时订阅ReplaySubject,ReplaySubject均会发射所有来自原始Observable的数据给Observer。有不同类型的ReplaySubject,它们用于限定Replay的范围,例如设定Buffer的具体大小,或者设定具体的时间范围。如果使用ReplaySubject作为Observer,注意不要在多个线程中调用onNext、onComplete和onError方法。这可能会导致顺序错乱,并且违反了Observer规则。

5.CompletableSubject

只发送Observer发射完毕数据,即:只发送onCompelted()

6.MaybeSubject

MaybeSubject所有方法都是线程安全的。主要用于发送一个结果数据,主要方法onSuccess(),多次调用无效。一般用于验证某个结果。

7.SingleSubject

SingleSubject和MaybeSubject区别不大,MaybeSubject提供了状态方法,比如:onComplete()和onErrorComplete(),而SingleSubject没有这些方法,更是印证了Single这个名字,只有onSuccess()这一个发射方法。

8.UnicastSubject

只允许一个 Observer 进行监听,在该 Observer 注册之前会将发射的所有的事件放进一个队列中,并在 Observer 注册的时候一起通知给它。如果有多个观察者订阅(监听),程序报错,但是没有抛出异常。

 

 



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章