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


113

谁能用清晰的示例解释RxJava中Observable,Completable和Single之间的区别?

在哪种情况下,我们会使用另一种情况?


你有没有经历过?
J. Chomel

我最近才刚开始.. @ J.Chomel
Raja Jawahar

25
这是一个完全有效的问题,不应关闭。尽管rx是一个很棒的库,但不幸的是,文档和示例非常贫乏且令人困惑。
RunLoop

Answers:


246

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

Single并且Completable是RxJava专门引入的新类型,它们代表的简化类型Observable,具有更简洁的API。

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

Completable表示Observable不发出任何值,但仅发出终端事件,onError或者onCompleted

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

  • 对象集合-可观察

  • 单个对象-单个

  • 和不返回任何值的方法(无效方法)-可完成。

Single当您具有面向任务的Observable且希望获得单个值(例如,一次执行网络请求并返回值(或错误))时,可能是合适的,这意味着网络调用是一次性运行的,这意味着您不希望它返回其他值随着时间的推移。另一个示例是DB获取数据操作。

Completable当您有一个Observable并且不关心该操作产生的值或没有任何值时,它是合适的。例如更新缓存,操作可以成功/失败,但是没有价值。
另一个示例是一些长时间运行的init操作,该操作不会返回任何内容。可能是仅通过成功指示导致的UPDATE / PUT网络呼叫。

无论如何,Completable和Single并没有添加新功能,而是引入了更健壮和简洁的API,可以进一步了解该API公开的Observable背后的操作。

编辑:

RxJava2 Maybe

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

在与上述相同的语言中,Maybe可以将其视为返回Optional某种类型的方法 ,Optional是对Object的包装,该包装明确告知我们其中是否具有某些值- Object而不是(而不是null)。
有了,Maybe我们要么拥有完全一样的价值,要么就什么Single也没有回报-就像Completable。此外,就像两者一样,我们也有错误。
Maybe当我们想要标记an Observable可能没有值并且将要完成时,它是有价值的。
将从缓存中获取一个示例,我们不一定在缓存中有一个值,因此在这种情况下,我们将完成,因为我们将从onNext缓存中获取该值。
使用RxJava2处理流中的非null值也是值得的。

RxJava2 Flowable

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


2
流动性如何?
Niraj Chauhan

因此,如果我在Kotlin中写作Maybe<T>,从本质上讲是Single<T?>
AAverin

您可以考虑Single将其作为Completable返回值吗?
Eido95 '18 -10-16

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.