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);

小结

Subject AsyncSubject 不论订阅发生在什么时候,只会发射最后一个数据 BehaviorSubject 发送订阅之前一个数据和订阅之后的全部数据 ReplaySubject 不论订阅发生在什么时候,都发射全部数据 PublishSubject 发送订阅之后全部数据

二、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也可以与以下操作符 混合使用

操作符 返回值 说明 compose Single 创建一个自定义的操作符 concat and concatWith Observable 连接多个Single和Observable发射的数据 create Single 调用观察者的create方法创建一个Single error Single 返回一个立即给订阅者发射错误通知的Single flatMap Single 返回一个Single,它发射对原Single的数据执行flatMap操作后的结果 flatMapObservable Observable 返回一个Observable,它发射对原Single的数据执行flatMap操作后的结果 from Single 将Future转换成Single just Single 返回一个发射一个指定值的Single map Single 返回一个Single,它发射对原Single的数据执行map操作后的结果 merge Single 将一个Single(它发射的数据是另一个Single,假设为B)转换成另一个Single(它发射来自另一个Single(B)的数据) merge and mergeWith Observable 合并发射来自多个Single的数据 observeOn Single 指示Single在指定的调度程序上调用订阅者的方法 onErrorReturn Single 将一个发射错误通知的Single转换成一个发射指定数据项的Single subscribeOn Single 指示Single在指定的调度程序上执行操作 timeout Single 它给原有的Single添加超时控制,如果超时了就发射一个错误通知 toSingle Single 将一个发射单个值的Observable转换为一个Single zip and zipWith Single 将多个Single转换为一个,后者发射的数据是对前者应用一个函数后的结果