【问题标题】:RxJava: Call network multiple times with increasing delay, ignoring errorsRxJava:多次调用网络,延迟增加,忽略错误
【发布时间】:2016-07-06 14:58:49
【问题描述】:

我想为网络调用创建一种指数退避。 但不是通常的退避间隔,我的网络调用应该重复几次(延迟增加)然后完成 - 无论网络调用的结果是什么。

例如,默认情况应如下所示:

    → wait 1s → network call → onNext(result)
    → wait 3s → network call → onNext(result)
    → wait 10s → network call → onNext(result)
    → onCompleted

当某些网络调用出现错误时,应记录这些错误,但不会中止任务本身。假设第二个网络调用有错误,那么它应该是这样的:

    → wait 1s → network call → onNext(result)
    → wait 3s → network call error → log error
    → wait 10s → network call → onNext(result)
    → onCompleted

当所有调用都有错误时:

    → wait 1s → network call error → log error
    → wait 3s → network call error → log error
    → wait 10s → network call error → log error
    → onCompleted

我已经有一个可以调用网络的 Observable,代码如下:

public Observable<Stuff> loadStuff() {
    Request request = new Request.Builder()
        .url("http://example.com/stuff").build();
    return myCall(request, Stuff.class);
}

public <T> Observable<T> myCall(Request request, Class<T> resultClass) {
    // calls OkHttp3 and parses the result
    return okhttp(request)
            .flatMap(parseResponse(resultClass));
}

如何重复使用来自loadStuff() 的 Observable 来实现我想要的退避间隔?

【问题讨论】:

    标签: java android network-programming rx-java reactivex


    【解决方案1】:

    似乎您可以使用 RetryWhenonErrorResumeNext 来避免管道中断,在 RetryWhen 中,您可以返回一个具有指数延迟的 Observable 来实现您的目标想要。

          @Test
    public void observableOnErrorResumeNext() {
        Subscription subscription = Observable.just(null)
                                              .map(Object::toString)
                                              .doOnError(failure -> System.out.println("Error:" + failure.getCause()))
                                              .retryWhen(errors -> errors.doOnNext(o -> count++)
                                                                         .flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null)),
                                                         Schedulers.newThread())
                                              .onErrorResumeNext(t -> {
                                                  System.out.println("Error after all retries:" + t.getCause());
                                                  return Observable.just("I save the world for extinction!");
                                              })
                                              .subscribe(s -> System.out.println(s));
        new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
    }
    

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

    【讨论】:

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