如何在Android上的RxJava中正确使用onError + Throwable?

时间:2017-07-08 10:09:51

标签: android rx-java2

ObservableEmitter的onError需要传入一个Throwable实例,但如果我只有一些错误数据,最佳做法是什么?如下所示:

    Observable<JSONObject> o1 = Observable.create(new ObservableOnSubscribe<JSONObject>() {
    @Override
    public void subscribe(final ObservableEmitter<JSONObject> e) throws Exception {
    RemoteApi.getInstance().addR(context, tag, new AsyncCallback<JSONObject, Error>() {
        @Override
        public void onSuccess(JSONObject result) {
        if(e.isDisposed()) {
            return;
        }
        e.onNext(result);
         e.onComplete();
        }

        @Override
        public void onFailure(Error error) {
        if(e.isDisposed()) {
            return;
        }
        e.onError(new Throwable(error.getCode() + " " + error.getMessage()));
        }
    });
    }
});

如何正确传递错误数据?我只是为这种异常创建一个包装类:

    private static class RxJavaExceptionError extends Exception {
    private Object object;
    public RxJavaExceptionError(Object object) {
        this.object = object;
    }
    public Object get() {
        return object;
    }
}

我使用对象成员传递数据。但是我发现我需要很多人使用instanceof来确定它是否是RxJavaExceptionError,这不是很令人愉快。那么这种情况下的最佳做法是什么?我不认为这是一个不寻常的案例。

我清楚地表达了吗?我的英语不太好。

1 个答案:

答案 0 :(得分:0)

抱歉,我不太了解您的用例。如果您想要抛出错误并通过管道传播,您是否尝试过运算符onErrorResumeNext?

/**
 * Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated
 */
@Test
public void observableOnErrorResumeNext() {
    Subscription subscription = Observable.just(null)
            .map(Object::toString)
            .doOnError(failure -> System.out.println("Error:" + failure.getCause()))
            .retryWhen(errors -> errors.doOnNext(o -> count++)
                            .flatMap(t -> count > 3 ? Observable.error(t) :
                                    Observable.just(null).delay(100, TimeUnit.MILLISECONDS)),
                    Schedulers.newThread())
            .onErrorResumeNext(t -> {
                System.out.println("Error after all retries:" + t.getCause());
                return Observable.just("I save the world for extinction!");
            })
            .subscribe(s -> System.out.println(s));
    new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
}

如果您想查看更多示例请点击此处

https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/errors/ObservableExceptions.java