RxJava基于逻辑重试

时间:2015-06-15 07:48:29

标签: retrofit rx-java rx-android

在这种情况下,我有API调用usign Retrofit可能因网络错误而失败。如果失败,我们将使用重试按钮显示错误消息。当用户按下重试按钮时,我们需要再次重试最新的Observable。

可能的解决方案:

  1. 重试:在订阅observable之前应该使用重试,如果发生错误,它会立即重新订阅,这是我不想要的,只有当用户按下重试按钮时才需要重新订阅。 / p>

  2. RetryWhen:它会继续尝试,直到你发出Observable错误然后它会停止。同样的问题,除非使用决定,否则我不需要启动重试过程。

  3. 重新订阅同一个Observable:这个解决方案将开始发出Observable项目,问题是我们正在使用缓存操作符,所以如果一个Observable失败,我们得到缓存的失败项目,当我们做再次订阅,我们又遇到了同样的错误。

  4. 还有其他解决方案吗?

1 个答案:

答案 0 :(得分:7)

你可以使用retryWhen,哪个参数-Func1-返回一个Observable,它指示何时应该重试。例如:

PublishSubject<Object> retryButtonClicked = PublishSubject.create();

Observable
        .error(new RuntimeException())
        .doOnError(throwable -> System.out.println("error"))
        .retryWhen(observable -> observable.zipWith(retryButtonClicked, (o, o2) -> o))
        .subscribe();

retryButtonClicked.onNext(new Object());

每次retryButtonClicked emmits事件时,都会重试Observable

这里也是一个例子 - https://gist.github.com/benjchristensen/3363d420607f03307dd0