RxRelay - 在订阅时强制执行onComplete和onError

时间:2018-01-18 22:29:52

标签: rx-java rx-java2

我正在寻找一种优雅的方式来隐藏Rx Relay作为一个可观察的,但强制订阅者只会在onNext上。

将中继暴露给外部类的典型过程是提供公共方法并隐藏中继:

public Observable<Boolean> booleanStream() { return myBooleanRelay.hide(); }

可悲的是,我们失去了这个流永远不会终止的事实。对于外部观察者,有必要处理终端onCompleteonError事件。但这完全是错误的,因为任何对这些事件的处理都不会被称为。

基本上,我想实现Completable的反转。

是否有利用现有RxJava接口的优雅解决方案?或者这需要手工制作?

1 个答案:

答案 0 :(得分:2)

如果确保没有错误或完成,您可以使用subscribe(Consumer)

否则,没有可用于此类API设计的RxJava接口。您必须推出自己的反应型基础类型和反应性消费者变体。从技术上讲,java.util.Observable是如此无限,无错误的来源,但缺乏运算符,并且使用其架构来开发这些运算符非常繁琐(另请参阅Google Agera)。

但请注意,强行忽略错误和完成会对您的流量和设计产生不利影响。例如,如果不允许出错,则用户回调不能抛出任何(运行时)异常。与具有潜在错误结果的API交谈需要人们放弃错误并实际上使流程无限期地挂起。其次,永无止境的流可能最终消耗flatMap的可用内存;内部流程永远不会终止,但只会变得更多,因为操作员必须无限期地跟踪它们,以防它们中的任何一个在某个时刻发出更多的物品。 concatMap和类似的运算符将不再作为延续运行。 toList永远不会正常工作(OOME)。