使用.create()

时间:2018-10-18 15:43:15

标签: java android reactive-programming rx-java2

各种RxJava2流(SingleMaybe等-我将它们称为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),{{1}之后,发射器实现将处置/取消此实例(哪个实例?) }或onComplete()成功。”

我对此有疑问:

  • 为什么不能用普通的tryOnError(Throwable)Xxx返回Observer的{​​{1}}创建一个.subscribe()
  • 为什么将Disposable.onSubscribe()中淘汰?
  • 要求使用Emitter的理由是什么?
  • 您何时使用EmitterCancellable
  • 添加Disposable对您有什么帮助?

此方案是否有更完整的说明?

(可能相关:我的Android应用似乎正在遇到.tryOnError()运算符的某些奇怪行为。.retry()是否在尝试重新订阅之前在上游调用.retry()?)

1 个答案:

答案 0 :(得分:0)

  

什么实例?

preceding sentence in the docs的上下文中应该很清楚:

  

发射器允许分别通过DisposableCancellablesetDisposable(Disposable)setCancellable(Cancellable)的形式注册单个资源。当下游取消​​流或在事件生成器逻辑调用onSuccess(Object)Emitter.onError(Throwable)Emitter.onComplete()之后或tryOnError(Throwable)成功时,发射器实现将处置/取消此实例。 >

DisposableCancellable的实例。

  

为什么不能使用普通观察者创建Xxx

我们不希望用户调用onSubscribe方法,因为它在运算符中没有用。我们无法隐藏方法,因此我们仅使用受支持的方法设计了单独的接口。

  

带有.subscribe()返回一次性的东西吗?

由于所谓的同步取消问题。如果您的方法由于某种原因从未返回,则无法返回Disposable,并且下游无法取消该流程。

  

为什么.onSubscribe()从发射器中删除

没有理由调用它,因为操作员将在调用发射器实现的Observer.onSubscribe方法之前为您处理对下游subscribe的调用。

  

要求发射器的理由是什么?

API设计。我们提供了一组清晰的方法,可以调用这些方法,而无需暴露那些本该不该起作用的方法。

  

什么时候使用可取消与一次性?

请阅读javadoc和签名。使用最方便的方式来满足您的资源取消需求。

  

添加.tryOnError()有什么帮助?

请阅读javadoc

  

此方案是否有更详尽的说明?

请使用各种方法javadocs查看每个示例。

  

.retry()是否在尝试重新订阅之前在上游调用.dispose()?

理论上,在收到错误时无需调用dispose,但是当前实现可以执行此操作。我必须考虑是否需要在RxJava中进行更改。