RxJava之Subject和Single
来源:互联网 发布:凡科建站 源码 下载 编辑:程序博客网 时间:2024/05/18 22:51
一、Subject
点开 RxJava2文档 ,找到关于Subject的描述:
public abstract class Subject<T>extends Observable<T>implements Observer<T>
对于Observable,Observer,Subscriber我们比较熟悉,故不做说明,重点来看Subject。
通过上面的图我们可以看出Subject继承自Observable,也就意味着Subject可以作为被观察者,另外,它又实现了Observer接口,这意味着它也可以作为观察者。不难看出,Subject既能作为Observer订阅Observable,又能作为Observable被其他Observer订阅。总之,Subject承担了这么一种角色:对上作为观察者,对下作为被观察者。
Subject的分类
从上面的uml中我们看出,RxJava为我们提供了四种常用的Subject,即
AsyncSubject,BehabviorSubject,PublishSubject,ReplaySubject,下面我们对这四者进行说明。
1.AsyncSubject
An Subject that emits the very last value followed by a completion event or the received error to Observers.
AsyncSubject会缓存最后一个数据并在调用onCompleted()时将该数据发送给订阅者,在该过程中,一旦发生任何异常都不会发送数据到订阅者,而是发送给订阅者一个异常通知,即订阅者只能接受到一个异常的通知。
举例来说明AsyncSubject的用法:
asyncSubject.onNext("1");asyncSubject.onNext("2");asyncSubject.onCompleted();//必须调用才会开始发送数据
以上代码执行后,订阅者接受到的数据是2.
2.BehabviorSubject
Subject that emits the most recent item it has observed and all subsequent observed items to each subscribed Observer.
当BehaviorSubject被订阅后,它首先会发送原始Observable最近发射的数据,如果最近没有,会发射一个默认值,接下继续发射原始Observable的数据。
例子如下:
// observer will receive all 4 events (including "default"). BehaviorSubject<Object> subject = BehaviorSubject.createDefault("default"); subject.subscribe(observer); subject.onNext("one"); subject.onNext("two"); subject.onNext("three"); // observer will receive the "one", "two" and "three" events, but not "zero" BehaviorSubject<Object> subject = BehaviorSubject.create(); subject.onNext("zero"); subject.onNext("one"); subject.subscribe(observer); subject.onNext("two"); subject.onNext("three"); // observer will receive only onComplete BehaviorSubject<Object> subject = BehaviorSubject.create(); subject.onNext("zero"); subject.onNext("one"); subject.onComplete(); subject.subscribe(observer); // observer will receive only onError BehaviorSubject<Object> subject = BehaviorSubject.create(); subject.onNext("zero"); subject.onNext("one"); subject.onError(new RuntimeException("error")); subject.subscribe(observer);
3.PublishSubject
Subject that, once an Observer has subscribed, emits all subsequently observed items to the subscriber.
Observable一旦被订阅就开始发送事件,如下图所示:
例子:
PublishSubject<Object> subject = PublishSubject.create(); // observer1 will receive all onNext and onComplete events subject.subscribe(observer1); subject.onNext("one"); subject.onNext("two"); // observer2 will only receive "three" and onComplete subject.subscribe(observer2); subject.onNext("three"); subject.onComplete();
4.ReplaySubject
Replays events to Observers.
ReplaySubject会缓存所有已经发射的数据,当一个新的订阅关系产生时,ReplaySuject会将所有数据都发送给他。如下图:
ReplaySubject<Object> subject = new ReplaySubject<>(); subject.onNext("one"); subject.onNext("two"); subject.onNext("three"); subject.onComplete(); // both of the following will get the onNext/onComplete calls from above subject.subscribe(observer1); subject.subscribe(observer2);
小结
二、Single
Single类似于Observable,不同的是,它总是只发射一个值,或者一个错误通知,而不是发射一系列的值。
因此,不同于Observable需要三个方法onNext, onError, onCompleted,订阅Single只需要两个方法:
onSuccess - Single发射单个的值到这个方法
onError - 如果无法发射需要的值,Single发射一个Throwable对象到这个方法
Single只会调用这两个方法中的一个,而且只会调用一次,调用了任何一个方法之后,订阅关系终止。
简单示例
Single.just(addValue(1, 2)).subscribe(new SingleSubscriber<Integer>() { @Override public void onSuccess(Integer value) { // value = 3 } @Override public void onError(Throwable error) {}});
Single也可以与以下操作符 混合使用
- RxJava之Subject和Single
- RxJava之二——Single和Subject
- RxJava之Subject
- Rxjava 之 Subject
- rxjava(二)Single与Subject
- RxJava之Subject分类解析
- RxJava学习篇之一:基础Observable,Observer,Single,Subject,Scheduler
- RxJava-Subject
- Rxjava分析—Subject
- Rxjava分析—Subject
- Rxjava Subject分析
- Rxjava Subject分析
- RxJava(RxAndroid)Subject学习
- Rxjava分析—Subject
- Rxjava(Subject)-AsyncSubject--demo
- Rxjava(Subject)-BehaviorSubject--demo
- Rxjava(Subject)-PublishSubject--demo
- Rxjava(Subject)-ReplaySubject--demo
- 欢迎使用CSDN-markdown编辑器
- Oracle_第三弹
- Linux主机之间传输文件的几种方法对比
- 能用到的工具和插件
- 金马公关为什么选择使用活字格来搭建《会议邀约系统》
- RxJava之Subject和Single
- Azure 中虚拟机的备份和还原选项
- golang版本protobuf 在windows系统下安装环境
- Oracle_第四弹
- 单例模式的七种写法
- Linux system Apache
- 如何利用EndNote,在word中插入参考文献
- Spring(三)注解装配
- 回到顶部按钮