我一直在尝试将我的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%做错了什么但却不能理解是什么。
答案 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());