RxJava 基于逻辑重试
RxJava retry based on logic
情况是这样的,我有一个使用 Retrofit 的 API 调用可能由于网络错误而失败。如果失败,我们将显示带有重试按钮的错误消息。当用户按下重试按钮时,我们需要再次重试最新的 Observable。
可能的解决方案:
重试:重试应该在订阅observable之前使用,如果发生错误它会立即重新订阅,这是我不想要的,我只需要在用户按下时重新订阅重试按钮。
RetryWhen:它会在你发出物品时不断尝试,直到你发出一个 Observable 错误,然后它才会停止。同样的问题,除非用户决定,否则我不需要启动重试过程。
重新订阅同一个 Observable:这个解决方案将开始发射 Observable 项目,问题是我们正在使用缓存运算符,所以如果一个 Observable 失败,我们会缓存失败的项目当我们再次订阅时,我们又遇到了同样的错误。
还有其他解决方案吗?
您可以使用 retryWhen,其中参数 - Func1 - returns 一个 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
情况是这样的,我有一个使用 Retrofit 的 API 调用可能由于网络错误而失败。如果失败,我们将显示带有重试按钮的错误消息。当用户按下重试按钮时,我们需要再次重试最新的 Observable。
可能的解决方案:
重试:重试应该在订阅observable之前使用,如果发生错误它会立即重新订阅,这是我不想要的,我只需要在用户按下时重新订阅重试按钮。
RetryWhen:它会在你发出物品时不断尝试,直到你发出一个 Observable 错误,然后它才会停止。同样的问题,除非用户决定,否则我不需要启动重试过程。
重新订阅同一个 Observable:这个解决方案将开始发射 Observable 项目,问题是我们正在使用缓存运算符,所以如果一个 Observable 失败,我们会缓存失败的项目当我们再次订阅时,我们又遇到了同样的错误。
还有其他解决方案吗?
您可以使用 retryWhen,其中参数 - Func1 - returns 一个 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