RxJava2 materialize()在发生错误后不会发出下一个项目

时间:2018-01-24 14:46:49

标签: android rx-java2 rx-android

我一直在尝试将我的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");
}

结果是在&#34; 2&#34;之后不再发出任何物品。给出了错误。我也试图在我自己的Notification对象(MyNotification<T>)上扭曲并执行以下操作:

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

但最终结果总是一样的:&#34; 2&#34;不再发出任何物品。我100%做错了什么但却不能理解是什么。

1 个答案:

答案 0 :(得分:1)

使用flatMap,如果其中一个内部Observable失败,则序列终止,不再从上游转换项目。在 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());