RxJava重试时重新订阅传播

前端之家收集整理的这篇文章主要介绍了RxJava重试时重新订阅传播前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在Android应用程序中使用Retrofit和RxJava进行通信,并且必须处理从似乎正常的HTTP响应(状态200代码)解析响应时出错.

我还使用retryWhen运算符实现了一种处理错误方法,该运算符连接到用户的输入以决定是否重试.这可以通过重新订阅原始的Observable来实现.

我尝试的第一种方法是这样的:

services.getSomething()
  .map(response -> {
    if (checkBadResponse(response)) {
      throw new RuntimeException("Error on service");
    } else {
      return parseResponse(response);
    }
  }).retryWhen(this::shouldRetry);

有了这个,服务不会再被调用.看来retryWhen运算符无法重新订阅服务的Observable.

最终的工作是实现另一个操作符,该操作符不发送onCompleted向前并使用升降机,如下所示:

public class CheckResponseStatus

使用它像:

services.getSomething()
  .lift(new CheckResponseStatus())
  .map(response -> parseResponse(response))
  .retryWhen(this::shouldRetry);

这是处理它的正确方法还是有更简单,更好的方法

最佳答案
它看起来像是rx-java实现中的一个bug.无论如何,从map函数抛出异常是一件坏事,因为该函数应该是纯粹的(例如没有副作用).您应该在您的情况下使用flatMap运算符:

services.getSomething()
  .flatMap(response -> {
    if (checkBadResponse(response)) {
      return Observable.

上面的代码按预期工作,如果发生错误,则会重新尝试请求.

猜你在找的Android相关文章