【问题标题】:How to continue streaming items after error in RxJava?RxJava 出错后如何继续流式传输项目?
【发布时间】:2016-11-02 13:07:22
【问题描述】:

我是 RxJava 新手,遇到以下问题。 假设我有一系列项目并且一个项目传播错误,我想忽略它并继续处理其他项目。

我有以下 sn-p:

    Observable.from(Arrays.asList("1", "2", "3"))
            .map(x -> {
                if (x.equals("2")) {
                    throw new NullPointerException();
                }
                return x + "-";
            })
            .onExceptionResumeNext(Observable.empty())
            .subscribe(System.out::println);

我得到:1-

但我想得到:1-、3-

我该怎么做?

【问题讨论】:

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


【解决方案1】:

诀窍是将值包装成一个新的 observable 和 flatmap,如下例所示。 flatMap 中的每个值现在都可以抛出异常并逐个处理它。因为 flatMap 中的子流只包含一个元素,所以在 onError 之后是否关闭 observable 并不重要。我使用 RxJava2 作为测试环境。

@Test
public void name() throws Exception {
    Observable<String> stringObservable = Observable.fromArray("1", "2", "3")
            .flatMap(x -> {
                return Observable.defer(() -> {
                    try {
                        if (x.equals("2")) {
                            throw new NullPointerException();
                        }
                        return Observable.just(x + "-");
                    } catch (Exception ex) {
                        return Observable.error(ex);
                    }
                }).map(s -> {
                    if (s.equals("3-")) {
                        throw new IllegalArgumentException();
                    }
                    return s + s;
                }).take(1)
                        .zipWith(Observable.just("X"), (s, s2) -> s + s2)
                        .onErrorResumeNext(Observable.empty());
            });

    TestObserver<String> test = stringObservable.test();

    test.assertResult("1-1-X");
}

【讨论】:

  • 非常感谢!我还有一个问题:所以如果我有十个转换器并且每个转换器都可以抛出异常,那么我应该用这段代码包装每个转换器???
  • 一如既往的回答是:这取决于你想做什么。如果您不仅要将 map 操作符添加到新的 observable 上,还想添加其他一些操作符,我建议您将它们放在 onErrorResumeNext 之前。如果其中一个运算符失败,则该值(例如 2)将失败,而是返回一个空的 observable。如果您想处理每个运算符的备份值,您可以将子流重新包装到一个新的流中并对其进行平面映射。请提供更多代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多