RxJava之Subject和Single

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

操作符返回值说明
composeSingle创建一个自定义的操作符
concat and concatWithObservable连接多个Single和Observable发射的数据
createSingle调用观察者的create方法创建一个Single
errorSingle返回一个立即给订阅者发射错误通知的Single
flatMapSingle返回一个Single,它发射对原Single的数据执行flatMap操作后的结果
flatMapObservableObservable返回一个Observable,它发射对原Single的数据执行flatMap操作后的结果
fromSingle将Future转换成Single
justSingle返回一个发射一个指定值的Single
mapSingle返回一个Single,它发射对原Single的数据执行map操作后的结果
mergeSingle将一个Single(它发射的数据是另一个Single,假设为B)转换成另一个Single(它发射来自另一个Single(B)的数据)
merge and mergeWithObservable合并发射来自多个Single的数据
observeOnSingle指示Single在指定的调度程序上调用订阅者的方法
onErrorReturnSingle将一个发射错误通知的Single转换成一个发射指定数据项的Single
subscribeOnSingle指示Single在指定的调度程序上执行操作
timeoutSingle它给原有的Single添加超时控制,如果超时了就发射一个错误通知
toSingleSingle将一个发射单个值的Observable转换为一个Single
zip and zipWithSingle将多个Single转换为一个,后者发射的数据是对前者应用一个函数后的结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值