RxJava 中的 Observable、Completable 和 Single 有什么区别

What is the difference between Observable, Completable and Single in RxJava

谁能用清晰的例子解释一下 RxJava 中 Observable、Completable 和 Single 之间的区别?

在哪种情况下我们使用一种而不是另一种?

Observable 是通用的 ReactiveX 构建块,事件源随时间发出值。 (因此存在于 ReactiveX 扩展到的每种语言中)
简而言之,Observable 事件是:
onNext*(onCompleted | onError)? /(* 零个或多个 ? - 零个或 1)

Single and Completable 是 RxJava 专门引入的新类型,代表 Observable 的简化类型,具有更简洁的 API.

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

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

您可以将这些差异想象成 return 方法的差异:

  • 对象集合 - Observable

  • 单个对象 - 单个

  • 和 return 没有值的方法(无效方法)- 可完成。

Single 当你有面向任务的 Observable 并且你期望单一值时可能是合适的,比如执行一次的网络请求和 return 值(或错误),网络调用在一个操作时间时尚,这意味着您不希望它随着时间的推移 return 增加价值。再比如DB fetch数据操作。

Completable 当您有一个 Observable 并且您不关心操作产生的值,或者没有任何值时,它是合适的。 比如更新一个缓存的例子,操作可以succeed/fail,但是没有值。
另一个例子是一些长 运行 初始化操作,但没有 return 任何东西。它可以是 UPDATE/PUT 只产生成功指示的网络调用。

无论如何,Completable 和 Single 都没有添加新功能,但它们引入了更健壮和简洁的 APIs,这说明了更多关于 API 公开的 Observable 背后的操作。

编辑:

RxJava2 Maybe:

RxJava2增加了一个新的类型MaybeMaybeCompletable和Single的组合。

在与上面相同的语言中,Maybe 可以被认为是 return 的方法 Optional 某种类型,Optional 是 Object 的包装器,它明确地告诉我们是否有一些值 - Object 或没有(而不是 null)。
使用 Maybe 我们可以得到一些与 Single 完全相同的值,或者 return 什么都没有——就像 Completable 一样。此外,与两者一样,我们也有错误。
Maybe 当我们想要标记一个 Observable 可能没有值并且只会完成时,它是有价值的。
一个例子将从缓存中获取,我们不一定在缓存中有一个值,所以在这种情况下,我们将完成,o.w。我们将从缓存中获取 onNext 的值。
这也值得用 RxJava2 处理流中的非空值。

RxJava2 Flowable:

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

  1. FlowableObservable 可以表示有限流或无限流。 可流动支撑 背压.
  2. Single 是具有单个元素的流。
  3. 可能 是具有 0 个或 1 个元素的流。
  4. 最后一个 Completable 表示一个没有元素的流,即它 只能在没有值的情况下完成或失败。

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

单&单观察者

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

Single 的一个用例是进行网络调用以获取响应,因为将立即获取响应。

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


Completable & CompletableObserver

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

一个用例是通过发出 PUT 请求更新服务器上的一些数据。