9

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

可能的解决方案:

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

  2. RetryWhen:它会在您发出项目时继续尝试,直到您发出 Observable 错误,然后它将停止。同样的问题,除非用户决定,否则我不需要开始重试过程。

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

还有其他解决方案吗?

4

1 回答 1

8

您可以使用 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 发出事件,Observable 都会被重试

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

于 2015-06-15T08:14:15.887 回答