RxJava的Subject
要使用Rxjava首先要导入两个包,其中rxandroid是rxjava在android中的扩展
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.2.0'
Subject
Subject 既可以是一个 Observer 也可以是一个 Observerable,它是连接 Observer 和Observerable的桥梁
PublishSubject
PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一创建完成就立刻开始发射数据,因此这里会有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来自原始Observable的所有数据都被分发,则可以当所有观察者都已经订阅时才开始发射数据,或者改用ReplaySubject。
PublishSubject<String> publishSubject = PublishSubject.create();
publishSubject.onNext("哈哈哈"); //数据不会发射给观察者
publishSubject.subscribe(observer);
publishSubject.onNext("哈哈哈2"); //数据会发射给观察者
BehaviorSubject
当Observer订阅BehaviorSubject时,它开始发射原始Observable最近发射的数据。如果此时还没有收到任何数据,它会发射一个默认值,然后继续发射其他任何来自原始Observable的数据。如果原始的Observable因为发生了一个错误而终止,BehaviorSubject将不会发射任何数据,但是会向Observer传递一个异常通知。
BehaviorSubject<String> behaviorSubject = BehaviorSubject.create();
behaviorSubject.onNext("哈哈0"); //数据不会发射给观察者
behaviorSubject.onNext("哈哈1"); //数据会发射给观察者
behaviorSubject.subscribe(observer);
behaviorSubject.onNext("哈哈2");
behaviorSubject.onNext("哈哈3");
如果继续引用 observable.subscribe(behaviorSubject); 则会打印
observer onNext is come in s= 哈哈1
observer onNext is come in s= 哈哈2
observer onNext is come in s= 哈哈3
observer onNext is come in s= observable call onNext0
observer onNext is come in s= observable call onNext
observer onCompleted is come in
ReplaySubject
不管Observer何时订阅ReplaySubject,ReplaySubject均会发射所有来自原始Observable的数据给Observer。有不同类型的ReplaySubject,它们用于限定Replay的范围,例如设定Buffer的具体大小,或者设定具体的时间范围。如果使用ReplaySubject作为Observer,注意不要在多个线程中调用onNext、onComplete和onError方法。这可能会导致顺序错乱,并且违反了Observer规则。
ReplaySubject<String> replaySubject = ReplaySubject.create();
replaySubject.onNext("哈哈0"); //数据会发送给观察者
replaySubject.onNext("哈哈1"); //数据会发送给观察者
replaySubject.subscribe(observer);
replaySubject.onNext("哈哈2");
replaySubject.onNext("哈哈3");
AsyncSubject
当Observable完成时(必须调用onCompleted()才会发射数据),AsyncSubject只会发射来自原始Observable的最后一个数据(不管数据在订阅前还是订阅后)。如果原始的 Observable 因为发生了错误而终止,AsyncSubject 将不会发射任何数据,但是会向Observer传递一个异常通知。
AsyncSubject<String> asyncSubject = AsyncSubject.create();
asyncSubject.onNext("哈哈0");//数据不会发送给观察者
asyncSubject.onNext("哈哈1");//数据不会发送给观察者
asyncSubject.onNext("哈哈2");//数据不会发送给观察者(如果没有哈哈3和哈哈4 则本条数据会发射给观察者)
asyncSubject.subscribe(observer);
asyncSubject.onNext("哈哈3"); //数据不会发送给观察者
asyncSubject.onNext("哈哈4"); //数据会发送给观察者
asyncSubject.onCompleted(); //数据会发送给观察者
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcbkjc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13