java - RxJava : How to prepend startWith() default emit EVERY TIME parent observable emits?

标签 java android rx-java reactive-programming rx-java2

我正在尝试建立一种模式,在这种模式下,我的产生某些对象的可观察对象被转换为领域事件,例如围绕可观察对象产生的 Started、Success、Error,如果这有意义的话

public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) {
        return extractObservable(epubPath)
                .flatMapObservable(extractedEpub -> renderObservable(extractedEpub)
                        .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub))
                        .onErrorReturn(t -> new BookRenderingEvent.Error())
                        .startWith(new BookRenderingEvent.Started()));
    }

private Observable<RenderedEpub> renderObservable(ExtractedEpub extractedEpub) {
        return Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..)
                    .switchMapSingle(foo -> doRenderObservable()) <--- heavy work
                    .map(bar -> new RenderedEpub(bar))
}

renderObservable 包含大量操作,因此我想发出这些状态事件,以便 UI 可以做出相应的 react (成功包含 extractedEpub 对象,如您在 map 中所见)

我的问题是,renderObservable 包含 combineLatest(),因此它“保持打开状态”并在其 obervables 发出时及时发出多次。

所以事件流是 Started, Success, Succes ... Success.

我希望它是 Started、Success、Started、Success .. 等,即在 combineLatest 发出时预先添加 Started 事件,但我的 rx 知识不足。 p>

谢谢

最佳答案

您可以将以下内容插入到可观察链的正确位置:

.flatMap( event -> Observable.just( new BookRenderingEvent.Started(), event )

这将在它接收到的每个事件之前发出 Started 事件。

当然,您可以添加一些逻辑,这样您就不会在事件为 Started 时发出 Started,等等。

关于java - RxJava : How to prepend startWith() default emit EVERY TIME parent observable emits?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614380/

相关文章:

java - 调用方法时出错

java - Glassfish javax.ejb.EJBException

android - 无法更改默认输出文件夹

java - 如何在两个 Observable 之间重用订阅者 (RxJava)

java - 禁用 Flowable/Observable 缓冲区

java - Android 内存不足错误

java - 我的 KafkaSpout 不使用 HDP 中来自 Kafka Brokers 的消息

Android-Studio 显示 XML 代码而不是设计

android - AudioTrack - 如何知道声音何时开始/结束?

java - 如何组合多个异步 RxJava Observables?