在RxJava中,Observable、Completable和Single有什么区别?

140

请问有人能够用简单的例子解释RxJava中Observable、Completable和Single之间的区别吗?

在什么场景下我们会选择其中一个而非其他两个呢?


36
这是一个完全有效的问题,不应该被关闭。虽然rx是一个很棒的库,但文档和示例非常差且令人困惑。 - RunLoop
3个回答

298

Observable是通用的ReactiveX构建块,它代表随着时间推移而发出值的事件源(因此存在于所有扩展到的语言中)
简而言之,Observable事件包括:
onNext* (onCompleted | onError)? /(* 零个或多个 ? - 零个或1个)

SingleCompletable是RxJava专门引入的新类型,表示Observable的简化形式,具有更简洁的API。

Single表示发出单个值或错误的Observable

Completable表示不发出任何值,但仅发出终端事件,即onErroronCompleted

您可以将差异视为返回方法的差异:

  • 对象集合 - Observable

  • 单个对象 - Single

  • 不返回任何值的方法(void方法)- Completable。

Single适用于您具有任务导向的Observable并且您期望单个值,例如执行一次并返回值(或错误)的网络请求,网络调用是以一次性方式操作的,这意味着您不希望它随时间返回其他值。另一个例子是DB获取数据操作。

Completable适用于您具有Observable且不关心操作结果时,或者没有结果产生的情况。例如,更新缓存,操作可能成功/失败,但没有值。
另一个例子是某些不返回任何内容的长时间运行的初始化操作。它可以是仅提供成功指示的UPDATE/PUT网络调用。

无论如何,Completable和Single并没有添加新的功能,但它们引入了更强大和简洁的API,这些API告诉我们Observable背后的操作,而API则暴露。

编辑:

RxJava2 Maybe:

RxJava2添加了一种新类型称为MaybeMaybeCompletableSingle的结合。

与上文类似,Maybe可以被认为是返回某种类型的Optional的方法,Optional是一个围绕着对象的包装器,明确地告诉我们是否在其中有一些值-Object或者没有(而不是null)。
使用Maybe,我们可以像使用Single一样获得某些值,也可以返回空-就像Completable一样。此外,像两者一样,我们也有错误提示。
当我们想要标记Observable可能没有值并且将完成时,Maybe很有用。
一个例子是从缓存中获取,我们不一定在缓存中有一个值,如果有,我们将完成,否则,我们将从缓存中获取值并调用onNext方法返回。
这也值得在RxJava2中处理流中的非null值。

RxJava2 Flowable:

首先,让我们定义背压。背压是一种处理数据生成速度超过其处理速度的情况的方式。Flowable支持背压,允许下游请求项目。您可以在此处阅读有关差异的更多信息here


2
关于Flowable呢? - Niraj Chauhan
那么如果我用 Kotlin 写代码,Maybe<T> 本质上就是 Single<T?> 吗? - AAverin
你能否将 Single 视为带有返回值的 Completable - Eido95
易于阅读,谢谢! - neo

25
  1. FlowableObservable 可以表示有限或无限的流。 Flowable 支持背压(back-pressure)。
  2. Single 是仅包含一个元素的流。
  3. Maybe 是包含 0 或 1 个元素的流。
  4. 最后,Completable 表示没有元素的流,即只能完成而不返回值或失败。

我在这里找到了一个简洁的答案here关于 RXJava 部分。


2

Single & SingleObserver

Single只会发出一个值或抛出一个错误。 Single始终确保有一个发射。

使用Single的一个例子是,进行网络调用以获取响应,因为响应将一次性获取。

请注意,SingleObserver没有onNext()方法来发出数据,而是数据将在onSuccess(Note note)方法中接收。


Completable & CompletableObserver

Completable observable不会发出任何数据,而是通知任务的状态,无论是success还是failure。当您想执行某些任务但不期望任何值时,可以使用此observable。

使用案例是通过进行PUT请求更新服务器上的某些数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接