【问题标题】:How to send requests as long as they are not successful in RxJava?只要在 RxJava 中不成功,如何发送请求?
【发布时间】:2016-11-20 06:48:38
【问题描述】:

我在我的 Android 项目中使用 Retrofit + RxJava。但我的网络服务有限制(1 个请求\秒)。因此,当我经常单击“加载”按钮时,它会返回带有错误的 JSON。问题:只要查询不成功,我应该使用哪个 RxJava 操作符来重新发送查询?现在我只调用了 onError 方法,就是这样。

【问题讨论】:

  • 你试过retry吗? -reactivex.io/documentation/operators/retry.html - 我不确定,但我认为它并没有真正再次提出请求,但我认为你可以尝试一下,因为你已经有一个项目设置
  • throttleFirst ?它将发出第一个事件,并在间隔期间(此处为 1 秒)跳过下一个事件

标签: android retrofit rx-java


【解决方案1】:

使用 retryWhen 运算符,在您的特定用例中延迟 1 秒。

这是 Dan Lew 对同一主题的详细解释,http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/

【讨论】:

    【解决方案2】:

    你需要检查json是不是你喜欢的,如果不是你可以抛出一个运行时异常,然后使用retryWhen,你可以重试再次获取json。然后如果你所有的尝试都失败了,你可以使用操作符 onErrorResumeNext 获取最后一个错误,然后如果你想要返回一个默认的 json。

    int count = 0;
    
    @Test
    public void observableOnErrorResumeNext() {
        Subscription subscription = Observable.just(new JsonObject())
                                              .doOnNext(json -> if(json == BAD_JSON){ throw RuntimeException() })
                                              .retryWhen(errors -> errors.doOnNext(o -> count++)
                                                                         .flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null).delay(100, TimeUnit.MILLISECONDS)),
                                                         Schedulers.newThread())
                                              .onErrorResumeNext(t -> {
                                                  System.out.println("Error after all retries:" + t.getCause());
                                                  return Observable.just("You can return here a default Json");
                                              })
                                              .subscribe(s -> System.out.println(s));
        new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
    }
    

    如果需要,您可以在此处查看更多示例。 https://github.com/politrons/reactive

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2016-12-26
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多