简体   繁体   English

RxJava中出现错误后如何继续流式传输项目?

[英]How to continue streaming items after error in RxJava?

I'm RxJava newbie, and I've got following problem. 我是RxJava新手,遇到了以下问题。 Say I have sequence of items and on of items propagates error, I want to ignore it and to continue processing other items. 说我有一个项目序列,并且一个项目中的项目传播错误,我想忽略它并继续处理其他项目。

I have following snippet: 我有以下片段:

    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);

I'm getting: 1- 我得到:1-

But I want to get: 1- , 3- 但我想得到:1-,3-

How can I do that? 我怎样才能做到这一点?

the trick is to wrap the value, which would be transformed somehow, into a new observable and flatmap over it as in the following example. 诀窍是将值(以某种方式转换)包装为新的可观察的平面图,如以下示例所示。 Each value in the flatMap can now throw a exception and handle it value by value. 现在,flatMap中的每个值都可以引发异常并按值处理它。 Becuase the substream in flatMap consists only of one element, it does not matter if the observable will be closed after onError. 因为flatMap中的子流仅包含一个元素,所以在onError之后是否关闭可观察对象并不重要。 I use RxJava2 as test-environment. 我使用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");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM