【问题标题】:RxJava2 materialize() doesn't emit next item after an errorRxJava2 materialize() 出错后不发出下一项
【发布时间】:2018-01-24 14:46:49
【问题描述】:

我一直在尝试将我的 onErrors 转换为通知,以保持流发射项目。据我了解,materialize() 运算符就是这样做的。所以基本上:

materialize() / dematerialize() 可用于开启终端事件 进入通知

所以我根据这个问题(How to continue streaming items after error in RxJava?)对此进行了测试。我尝试了以下方法:

 @Test
public void materializeTest() {
    final Observable<String> stringObservable = Observable.fromArray("1", "2", "3")
            .flatMap(x -> {
                if (x.equals("2")) {
                    return Observable.error(new NullPointerException());
                }

                return Observable.just(x);
            })
            .materialize()
            .map(n -> n.getValue());

    final TestObserver<String> testObs = stringObservable.test();
    Java6Assertions.assertThat(testObs.values().size()).isEqualTo(2);

    testObs.assertValueAt(0, "1");
    testObs.assertValueAt(1, "3");
}

结果是在“2”给出错误后不再发出任何项目。我还尝试对自己的 Notification 对象 (MyNotification&lt;T&gt;) 进行变形并执行以下操作:

stringObs
  .map(string -> MyNotification.success(string)
  .onErrorReturn(error -> MyNotification.error())

但最终结果始终相同:在“2”之后不再发出任何项目。我 100% 做错了什么,但我无法真正理解是什么。

【问题讨论】:

    标签: android rx-java2 rx-android


    【解决方案1】:

    对于flatMap,如果内部Observables 之一失败,则序列终止,不再从上游转换任何项目。这发生在之前 materialize() 甚至参与其中。

    因此,与其尝试实现合并的流程,不如单独实现内部源:

    Observable.fromArray("1", "2", "3")
            .flatMap(x -> {
                if (x.equals("2")) {
                    return Observable.<String>error(new NullPointerException())
                                     .materialize();
                }
    
                return Observable.just(x)
                                 .materialize();
            })
            .filter(n -> n.isOnNext())
            .map(n -> n.getValue());
    

    【讨论】:

    • 我试过这个,但它仍然没有通过测试。我能够通过对平面地图内部发生的“MyNotification”进行地图和 onErrorReturn 操作来通过测试(基本上,你的建议,但没有 materialize())我可以发布该工作解决方案。
    • 啊,太好了! :D 非常感谢。我理解这个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多