Java 如何实现具有指数回退的HttpRequestRetryHandler?

Java 如何实现具有指数回退的HttpRequestRetryHandler?,java,android,httprequest,Java,Android,Httprequest,我希望在请求第一次失败的情况下为HttpClient实现一个 我还希望为以后的重试实现。从数学上讲,它可以实现为 但我现在很难在代码中实现它 使用HttpRequestRetryHandler。HttpRequestRetryHandler不允许您进行那种级别的控制;如果您想做一些非常具体的事情,我建议您实现一些类似于的东西,您可以在其中使用Handler.postDelayed()来延迟执行可运行文件,并根据您的公式增加延迟 Handler mHandler = new Handler()

我希望在请求第一次失败的情况下为HttpClient实现一个

我还希望为以后的重试实现。从数学上讲,它可以实现为

但我现在很难在代码中实现它
使用HttpRequestRetryHandler。

HttpRequestRetryHandler不允许您进行那种级别的控制;如果您想做一些非常具体的事情,我建议您实现一些类似于的东西,您可以在其中使用Handler.postDelayed()来延迟执行可运行文件,并根据您的公式增加延迟

Handler mHandler = new Handler();
int mDelay = INITIAL_DELAY;

// try request
mHandler.postDelayed(mDelay, new Runnable() {
   public void run() {
      // try your request here; if it fails, then repost:
      if (failed) {
          mDelay *= 2;  // or as per your formula
          mHandler.postDelayed(mDelay, this);
      }
      else {
          // success!
      }
   }
});

这是一个带有回退算法的好框架-

我用于重试任意函数调用的策略

我将其与我编写的库集成,该库包含几个等待策略,允许轻松构建与随机间隔(又称抖动)相结合的可靠指数退避:

例如,对于构建一个上限为15秒、抖动为50%的指数回退:

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
        .retryIfResult(Predicates.isNull())
        .withWaitStrategy(WaitStrategies.exponentialJitterWait(Duration.ofSeconds(15), 0.5D))
        .build();
retryer.call(callable);
Retryer-Retryer=RetryerBuilder.newBuilder()
.RetryFresult(谓词.isNull())
.withWaitStrategy(WaitStrategys.exponentialJitterWait,持续时间为秒(15),0.5D))
.build();
retryer.call(可调用);
该库经过良好的测试和记录,可以通过Maven Central轻松集成


我希望这能有所帮助。

嗨,Gaurav,你的最终解决方案是什么?它需要JDK 1.8