请问有人能够用简单的例子解释RxJava中Observable、Completable和Single之间的区别吗?
在什么场景下我们会选择其中一个而非其他两个呢?
Observable
是通用的ReactiveX构建块,它代表随着时间推移而发出值的事件源(因此存在于所有扩展到的语言中)
简而言之,Observable事件包括:
onNext* (onCompleted | onError)? /(* 零个或多个 ? - 零个或1个)
Single
和Completable
是RxJava专门引入的新类型,表示Observable
的简化形式,具有更简洁的API。
Single
表示发出单个值或错误的Observable
。
Completable
表示不发出任何值,但仅发出终端事件,即onError
或onCompleted
您可以将差异视为返回方法的差异:
对象集合 - Observable
单个对象 - Single
不返回任何值的方法(void方法)- Completable。
Single
适用于您具有任务导向的Observable并且您期望单个值,例如执行一次并返回值(或错误)的网络请求,网络调用是以一次性方式操作的,这意味着您不希望它随时间返回其他值。另一个例子是DB获取数据操作。
Completable
适用于您具有Observable且不关心操作结果时,或者没有结果产生的情况。例如,更新缓存,操作可能成功/失败,但没有值。
另一个例子是某些不返回任何内容的长时间运行的初始化操作。它可以是仅提供成功指示的UPDATE/PUT网络调用。
无论如何,Completable和Single并没有添加新的功能,但它们引入了更强大和简洁的API,这些API告诉我们Observable背后的操作,而API则暴露。
编辑:
Maybe
:RxJava2添加了一种新类型称为Maybe
,Maybe
是Completable
和Single
的结合。
与上文类似,Maybe
可以被认为是返回某种类型的Optional
的方法,Optional
是一个围绕着对象的包装器,明确地告诉我们是否在其中有一些值-Object
或者没有(而不是null)。
使用Maybe
,我们可以像使用Single
一样获得某些值,也可以返回空-就像Completable
一样。此外,像两者一样,我们也有错误提示。
当我们想要标记Observable
可能没有值并且将完成时,Maybe
很有用。
一个例子是从缓存中获取,我们不一定在缓存中有一个值,如果有,我们将完成,否则,我们将从缓存中获取值并调用onNext
方法返回。
这也值得在RxJava2中处理流中的非null值。
Flowable
:首先,让我们定义背压。背压是一种处理数据生成速度超过其处理速度的情况的方式。Flowable
支持背压,允许下游请求项目。您可以在此处阅读有关差异的更多信息here。
Maybe<T>
本质上就是 Single<T?>
吗? - AAverinSingle
视为带有返回值的 Completable
? - Eido95我在这里找到了一个简洁的答案here关于 RXJava 部分。
Single & SingleObserver
Single
只会发出一个值或抛出一个错误。 Single
始终确保有一个发射。
使用Single的一个例子是,进行网络调用以获取响应,因为响应将一次性获取。
请注意,SingleObserver
没有onNext()方法来发出数据,而是数据将在onSuccess(Note note)
方法中接收。
Completable & CompletableObserver
Completable
observable不会发出任何数据,而是通知任务的状态,无论是success
还是failure
。当您想执行某些任务但不期望任何值时,可以使用此observable。
使用案例是通过进行PUT请求更新服务器上的某些数据。