概述
前面在 RxJava 使用指南(一)– 基本概念、数据流创建和线程调度 一文中简单介绍了几种观察者模式组合的组合。
- Observable/Observer
- Flowable/Subscriber
- Single/SingleObserver
- Completable/CompletableObserver
- Maybe/MaybeObserver
其中 Observable/Observer
和 Flowable/Subscriber
比较常用,前面也用了大量篇幅来介绍,本文就来介绍一下 Single/SingleObserver
、Completable/CompletableObserver
和 Maybe/MaybeObserver
这三个组合的用法。
Single/SingleObserver 的用法
先来看一下代码中如何实现:
1 | Single.create(new SingleOnSubscribe<String>() { |
我们先从代码上来分析 Single/SingleObserver
和 Observable/Observer
的区别。SingleEmitter
和 ObservableEmitter
的区别:SingleEmitter
发射数据的方法只有 onSuccess()
和 onError()
,而 ObservableEmitter
多了个 onNext()
方法。
再来看一下 SingleObserver
和 Observer
的区别:SingleObserver
处理结果的方法有 onSubscribe()
、onSuccess()
和 onError()
。而 Observer
多了个 onNext()
和 onComplete()
方法,而没有 onSuccess()
方法。
结合 Single
本身的名字,我们可以联想到,这个组合是只能发射单个数据或者一条异常通知,不能发射完成通知,其中数据与通知只能发射一个。
那么 Single/SingleObserver
有什么使用场景呢?
我们在实际应用中,有时候需要发射的数据并不是数据流的形式,而只是一条单一的数据,比如发起一次网络请求。在这种情况下,如果我们使用 Observable
,onComplete
会紧跟着 onNext
被调用,为什么不能将这连个方法合二为一呢。如果再这种情况下我们再使用 Observable
就显得有点大材小用,因为我们不需要处理 onNext()
的数据。于是,为了满足这种单一数据的使用场景,便出现了 Single
。
转化为其他观察者模式
Single
基本上实现了 Observable
所有的操作符,如果你发现需要用到一个 Observable
的操作符而 Single
并不支持,你可以用 toObservable
操作符把 Single<T>
转换为 Observable<T>
。
另外 Single
还提供了其他转换方法:
- toCompletable()
- toMaybe()
- toFlowable()
- toFuture()
Completable/CompletableObserver 的用法
先通过代码来看一下用法:
1 | Completable.create(new CompletableOnSubscribe() { |
照例先来看一下 CompletableEmitter
:
它提供的数据和通知的方法如下:
- onComplete()
- onError()
CompletableObserver
的相关的方法:
- onSubscribe()
- onComplete()
- onError()
可以看到,这里面没有数据处理的方法,只有通知相关的方法。它只发射一条完成通知,或者一条异常通知,不能发射数据,其中完成通知与异常通知只能发射一个。
那么 Completable/CompletableObserver
有什么使用场景呢?
和前面 Single/SingleObserver
的用法比较类似,只是这里不对数据进行处理,只有个通知的结果。比如:我们向服务器发起一个更新数据的请求,服务器更新数据以后是返回的是更新的结果。这个时候我们或许只是关心的是服务器更新数据是否成功,而不需要对数据进行处理,那么这个时候用 Completable/CompletableObserver
就可以了。Completable
也提供了对 Observable
、Flowable
、Single
和 Maybe
的转换。
Maybe/MaybeObserver 的用法
再来看一下 Maybe
的用法:
1 | Maybe.create(new MaybeOnSubscribe<String>(){ |
Maybe
可发射一条单一的数据,以及发射一条完成通知,或者一条异常通知,其中完成通知和异常通知只能发射一个,发射数据只能在发射完成通知或者异常通知之前,否则发射数据无效。