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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Subject 是一种特殊的存在 在前面一篇文章Cold Observable 和 Hot Observable中...
- 前言 欢迎继续收看《RxJava入门与提高》,上周出了第一篇 RxJava入门与提高(1) 。本文主要给大家补充...
- 创建一个Observable Observable.create()该方法接收一个Obsubscribe对象 来个...
- 在前边RxJava实战技巧大全一文中,我们介绍了RxJava使用过程中常见的应用场景和可能遇到的问题,其中我们谈到...
- 写在前面的话 第一次听说Rxjava的时候,我顿时就懵b了,什么事RxJava?新的一门强大的语言么!顿时怀着对R...