各种RxJava2流(Single
,Maybe
等 - 我将它们称为Xxx
(有一个静态方法.create( XxxOnSubscribe onSubscribe )
。传递XxxOnSubscribe
对象应该实现方法void subscribe( XxxEmitter emitter )
。
Emitter
似乎像Observer
但有一些不同(它不完全是Observer
的扩展(:
- 它的
.subscribe()
方法返回void
而不是Disposable
- 它缺少一个
.onSubscribe()
方法(返回一个Disposable
( - 它添加了方法
.setCancellable()
、.setDisposable()
、.isDisposed()
和.tryOnError()
。
文档说"发射器实现将释放/取消此实例(什么实例?当下游取消流时,或者在事件生成器逻辑调用onSuccess(Object)
、onError(Throwable)
、onComplete()
或tryOnError(Throwable)
成功时。
我对此的问题包括:
- 为什么不能用正常的
Observer
创建Xxx
,.subscribe()
返回Disposable
? - 为什么
.onSubscribe()
被淘汰出Emitter
? - 要求
Emitter
的理由是什么? - 什么时候会使用
Cancellable
与Disposable
? - 添加
.tryOnError()
有什么帮助?
是否有关于此方案的更全面的解释?
(可能相关:我的Android应用程序似乎遇到了.retry()
操作员的一些奇怪行为。在尝试重新订阅之前,.retry()
是否调用上游.dispose()
?
什么实例?
从文档中前一句的上下文中应该很清楚:
发射器允许分别通过
setDisposable(Disposable)
或setCancellable(Cancellable)
以Disposable
或Cancellable
的形式注册单个资源。当下游取消流时,或者在事件生成器逻辑调用onSuccess(Object)
、Emitter.onError(Throwable)
、Emitter.onComplete()
或tryOnError(Throwable)
成功时,发射器实现将释放/取消此实例。
Disposable
或Cancellable
的实例。
为什么不能用普通观察者创建 Xxx
我们不希望用户调用onSubscribe
方法,因为它在运算符中没有用处。我们无法隐藏方法,因此我们设计了一个单独的接口,仅包含支持的方法。
带有 .subscribe(( 返回一次性的?
因为所谓的同步取消问题。如果方法由于某种原因从不返回,则无法返回Disposable
并且下游无法取消流。
为什么 .onSubscribe(( 从发射器中删除
没有理由调用它,因为在调用发射器实现的subscribe
方法之前,运算符将为您处理对下游Observer.onSubscribe
的调用。
要求发射器的理由是什么?
接口设计。我们提供了一组清晰的方法,可以在不公开不应该或无论如何都不起作用的方法的情况下调用这些方法。
您什么时候会使用可取消与一次性?
请阅读 javadoc 和签名。使用适合您资源取消需求的方便方法。
添加 .tryOnError(( 有什么帮助?
请阅读javadoc。
是否有关于此方案的更全面的解释?
请参阅各种方法javadocs中的每个示例。
.retry(( 在尝试重新订阅之前是否在上游调用 .dispose((?
从理论上讲,当收到错误时,不需要调用dispose
,但当前的实现无论如何都可以这样做。我必须考虑这是否需要在 RxJava 中改变。