Observable.retrywhen中的异常类型

时间:2017-03-12 10:15:00

标签: android rx-java rx-android

我是rxJava的新手,这可能是非常愚蠢的问题,但我无法弄清楚如何在重试时找到异常类型。 我想重试特定的异常(例如Io Exception),但是在其他异常上 我想把这个例外传递给链条。

public Observable<List<String>> getData()
{
    return apiConsumer.getData()
            .retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>()
            {
                @Override
                public Observable<?> call(Observable<? extends Throwable> observable)
                {
                    // if(exception type == io exception)
                    return observable.delay(5, TimeUnit.SECONDS);
                    //else
                    //  dont retry, pass the exception to onError
                }
            });
}

2 个答案:

答案 0 :(得分:3)

请尝试以下代码:

return apiConsumer.getData().retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
    @Override
    public Observable<?> call(Observable<? extends Throwable> observable) {
        return observable.flatMap(new Func1<Throwable, Observable<?>>() {
            @Override public Observable<?> call(Throwable throwable) {
                if(throwable instanceof IOException) {
                   // Retry code
                   // For example: retry after 5seconds
                   return Observable.timer(5, TimeUnit.SECONDS);
                }
                // Pass the throwable
                return Observable.error(throwable);
            }
        });
    }
});

答案 1 :(得分:0)

您可以检查异常类型,如下面的代码所示。将为每个错误调用flatMap内的lambda,您可以通过instanceof检查类型。我暂时没有和RXJava合作过,如果你的return observable.delay(5, TimeUnit.SECONDS);仍然有效,我还没有测试过。)

public Observable<List<String>> getData() {
    return apiConsumer.getData().retryWhen(errors -> errors.flatMap(error -> {  
        // This lambda will be called for each error. Check the type:
        if (error instanceof IOException) {
            return observable.delay(5, TimeUnit.SECONDS);
        }

        //Dont retry, pass the exception to onError
      })
    )
}

我的回答基于this tutorial,它提供了有关该主题的更多信息。