Rx java RxJava中可观察的、可完成的和单一的有什么区别

Rx java RxJava中可观察的、可完成的和单一的有什么区别,rx-java,rx-java2,Rx Java,Rx Java2,有人能用清晰的例子解释RxJava中可观察、可完成和单一的区别吗 在哪种情况下,我们使用一个而不是另一个?可观察的是事件源的通用ReactiveX构建块,随时间发出值。(因此存在于每种语言中,ReactiveX扩展到) 简言之,可观察事件为: onNext*(未完成| onError)/(*零或更多?-零或1) 并且是专门在RxJava中引入的新类型,它们表示可观察的的简化类型,具有更简洁的API Single表示发出单个值或错误的可观察的 Completable表示可观察的observeabl

有人能用清晰的例子解释RxJava中可观察、可完成和单一的区别吗


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

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

并且是专门在RxJava中引入的新类型,它们表示可观察的<代码>的简化类型,具有更简洁的API

Single
表示发出单个值或错误的
可观察的

Completable
表示可观察的
observeable
,它不发出任何值,只发出终端事件,
onError
onCompleted

您可以将这些差异看作是返回以下值的方法的差异:

  • 对象集合-可观察

  • 单个对象-单个

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

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

当您有一个可观察的
值,并且您不关心操作产生的值,或者没有任何值时,
Completable
是合适的。 例如更新缓存。例如,操作可以成功/失败,但没有值
另一个例子是一些长时间运行的init操作,它不返回任何内容。它可以是仅带有成功指示的更新/放置网络调用

在任何情况下,Completable和Single都没有添加新的功能,但它们引入了更健壮、更简洁的API,这更多地说明了API公开的可观察性背后的操作

编辑:

RxJava2
可能
: RxJava2添加了一个名为
Maybe
的新类型,
Maybe
Completable
和Single的组合

在上述相同的语言中,
可能可以看作是返回
Optional
对于某些类型,
Optional
是一个围绕对象的包装器,它显式地告诉我们其中是否有值-
Object
(而不是null)。
使用
Maybe
我们可以得到一些与
Single
完全相同的值,也可以不返回任何值-就像
Completable
一样。此外,与这两种方法一样,我们也有错误。
当我们想要标记一个
可观察的
可能没有值并且将刚刚完成时,
可能是有价值的
一个示例是从缓存中获取的,缓存中不一定有值,因此在这种情况下,我们将完成,当然,我们将使用缓存中的值获取
onNext

这也值得使用RxJava2处理流中的非空值

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

  • 可流动的可观察的可以表示有限或无限的流。 流动支撑背压
  • Single是具有单个元素的流
  • 可能是包含0或一个元素的流
  • 最后,可完成的表示没有元素的流,即 只能在没有值或失败的情况下完成

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

    单一和单一观察者

    Single
    始终只发出一个值或抛出一个错误<代码>单个
    始终确保有排放

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

    注意这里,
    SingleObserver
    没有onNext()来发送数据,而是通过
    onSuccess(注意)
    方法接收数据


    可完成和可完成观察者

    Completable
    observable将不会发出任何数据,而是通知任务的状态
    success
    failure
    。当您希望执行某项任务而不期望任何值时,可以使用此可观察值


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

    您有什么经验吗?我最近刚刚开始@这是一个完全正确的问题,不应该就此结束。虽然RX是一个很好的库,但文档和示例却非常糟糕和混乱。那么,FLASH?如果我在Kotlin写的是<代码>也许,本质上是<代码>单< /代码>?您可以考虑<代码>单<代码>具有返回值的<代码>可完成的< /代码>吗?