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

时间:2017-03-13 06:50:31

标签: rx-java rx-java2

任何人都可以用明确的例子解释RxJava中Observable,Completable和Single之间的区别吗?

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

3 个答案:

答案 0 :(得分:193)

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

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

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

Completable代表Observable,不会发出任何价值,只会发出onErroronCompleted

的终端事件

你可以想到差异,比如返回的方法的差异:

  • 对象集合 - 可观察

  • 单个对象 - 单个

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

当你有面向任务的Observable并且你期望单个值时,

Single可能是合适的,比如执行一次的网络请求并返回值(或错误),网络调用是一次性操作的,这意味着你不要不希望它随着时间的推移返回额外的值。另一个例子是DB获取数据操作。

当您拥有Completable并且您不关心操作产生的值时,

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

在任何情况下,Completable和Single都没有添加新功能,但它们引入了更强大,更简洁的API,它们更多地讲述了API暴露的Observable背后的操作。

修改

RxJava2 Maybe

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

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

RxJava2 Flowable

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

答案 1 :(得分:8)

  1. 可流动可观察可以表示有限或无限流。 可流动的支撑背压
  2. 单个是包含单个元素的流。
  3. 可能是包含0或1个元素的流。
  4. 最后, Completable 表示没有元素的流,即它 只能在没有价值或失败的情况下完成。
  5. 我在RXJava部分找到了here的简明回答。

答案 2 :(得分:1)

单服务器和单服务器

Single始终仅发出一个值或引发错误。 Single始终确保有排放。

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

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


Completable&CompletableObserver

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

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