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