Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用回退可观察x次数_Java_Android_Rx Java_Reactive Programming_Rx Android - Fatal编程技术网

Java 使用回退可观察x次数

Java 使用回退可观察x次数,java,android,rx-java,reactive-programming,rx-android,Java,Android,Rx Java,Reactive Programming,Rx Android,我有一个Observable,它在下一个方法中实现了错误处理 getMyObservable(params) .take(1) .doOnError(e -> { }) .onErrorResumeNext(throwable -> { if (throwable.getMessage().contains("401"

我有一个Observable,它在下一个方法中实现了错误处理

getMyObservable(params)
                .take(1)
                .doOnError(e -> {
                })
                .onErrorResumeNext(throwable -> {
                    if (throwable.getMessage().contains("401")) {
                        return getMyObservable(params);
                    } else {
                        sendServerCommunicationError();
                        return Observable.error(throwable);
                    }
                })
                .subscribe(result -> {
                             ...                                }
                });
GetMyObservable从生成的客户端返回web服务请求。用例是:如果我们收到401,我们可能需要用新的UserToken刷新客户端。这就是为什么我们在OneRorResumeNext中使用可观察的回退,而不能只使用重试

我有一些问题:

为什么我需要实现doon错误?如果我没有实现它,我有时会得到一个onError not implemented异常。我想,当我使用OneRorResumeNext时,如果出现错误,会自动使用此方法。 在401等特定错误上,我如何实现这一点?我使用了一个可观察到的回退时间,在回退5次后,我产生了一个错误。那么,我是否可以以某种方式将retryWhen和OneRorResumeNext结合起来,或者是否可以采用不同的方式? 为什么我需要实现doon错误

您不需要这样做,并且doError不是一个错误处理程序,而是一个错误通道。您必须在subscribe中实现一个错误处理程序:

我如何在特定的错误(如401)上实现这一点?我使用了一个可观察的回退时间,回退时间为5次之后

在以下情况下使用retryWhen:


但是当我使用Retry时,当我不使用回退观测值时。你的回退观测值是什么?你最初的问题表明你再次调用getMyObservable。我已经将答案更新为使用延迟,以防调用本身除了返回可观察对象运行之外还有副作用。这就是我想要的。但return Observable.errornew exception重试5次失败;不工作:Observable无法转换为ObservableSourceSpecify类型参数:Observable.error。。。;。
.subscribe(result -> {
    // ...
},
error -> {
    // ...
});
Observable.defer(() -> getMyObservable(params))
.retryWhen(errors -> {
    AtomicInteger count = new AtomicInteger();
    return errors.flatMap(error -> {
       if (error.toString().contains("401")) {
           int c = count.incrementAndGet();
           if (c <= 5) {
               return Observable.timer(c, TimeUnit.SECONDS);
           }
           return Observable.error(new Exception("Failed after 5 retries"));
       }
       return Observable.error(error);
    })
})