【问题标题】:What is the difference between Observable, Completable and Single in RxJavaRxJava 中的 Observable、Completable 和 Single 有什么区别
【发布时间】:2017-08-03 03:10:20
【问题描述】:

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

在哪种情况下我们会使用其中的一种?

【问题讨论】:

  • 你有什么经历吗?
  • 我最近才开始..@J.Chomel
  • 这是一个完全有效的问题,不应该被关闭。尽管 rx 是一个很棒的库,但不幸的是,文档和示例非常糟糕且令人困惑。

标签: rx-java rx-java2


【解决方案1】:

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

SingleCompletable 是 RxJava 独家引入的新类型,它们代表了 Observable 的简化类型,具有更简洁的 API。

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

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

你可以把这些区别想成返回方法的区别:

  • 对象集合 - 可观察

  • 单个对象 - 单个

  • 和不返回值的方法(void 方法) - 可完成。

Single 适用于面向任务的 Observable 并且您期望单个值,例如执行一次并返回值(或错误)的网络请求,网络调用以一次性方式操作,这意味着您不需要期望它随着时间的推移返回额外的值。另一个例子是 DB fetch 数据操作。

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

无论如何,Completable 和 Single 并没有添加新功能,而是引入了更健壮和简洁的 API,从而更多地了解 API 所公开的 Observable 背后的操作。

编辑:

RxJava2 Maybe:

RxJava2 新增了一个名为Maybe 的新类型,MaybeCompletable 和 Single 的组合。

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

RxJava2 Flowable:

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

【讨论】:

  • 流动性怎么样?
  • 所以如果我用 Kotlin 写作,是 Maybe<T>,本质上是 Single<T?>
  • 你能认为Single是一个有返回值的Completable吗?
【解决方案2】:
  1. FlowableObservable 可以表示有限或无限的流。 流动性支持背压
  2. Single 是具有单个元素的流。
  3. 也许是包含 0 个或一个元素的流。
  4. 最后一个 Completable 代表一个没有元素的流,即它 只能在没有值的情况下完成或失败。

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

【讨论】:

    【解决方案3】:

    Single & SingleObserver

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

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

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


    Completable & CompletableObserver

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多