OkHttpClient有一个最大重试计数

我正在为OkHttpClient设置连接失败的重试选项。

client = new OkHttpClient(); client.setRetryOnConnectionFailure(true); 

我想知道它会继续尝试多less次。 看看源代码,我没有看到任何最大限​​制。 如何configuration客户端在几次尝试后停止尝试?

Solutions Collecting From Web of "OkHttpClient有一个最大重试计数"

这里有更多的文档https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

configuration此客户端在遇到连接问题时重试或不重试。 默认情况下,这个客户端会自动从以下问题中恢复:

  • 无法访问的IP地址。 如果URL的主机有多个IP地址,则无法达到任何单独的IP地址不会使整个请求失败。 这可以增加多宿主服务的可用性。
  • 陈旧的汇集连接。 ConnectionPool重用套接字来减less请求延迟,但这些连接有时会超时。

  • 无法访问的代理服务器。 可以使用ProxySelector按顺序尝试多个代理服务器,最终回退到直接连接。

将此设置为false以避免重试请求时具有破坏性。 在这种情况下,调用应用程序应该自行恢复连接失败。

但通常情况下,我认为这是为了在存在一个已存在的旧连接时重试,或者是可以重试的备用path。 不要无限重试完全相同的事情。

另请参阅ConnectionSpecSelector.connectionFailed

我在下面做了一个解决方法:

 @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // try the request Response response = doRequest(chain,request); int tryCount = 0; while (response == null && tryCount <= RetryCount) { String url = request.url().toString(); url = switchServer(url); Request newRequest = request.newBuilder().url(url).build(); tryCount++; // retry the request response = doRequest(chain,newRequest); } if(response == null){//important ,should throw an exception here throw new IOException(); } return response; } private Response doRequest(Chain chain,Request request){ Response response = null; try{ response = chain.proceed(request); }catch (Exception e){ } return response; } 

没有内置的方法来设置最大限制,但你可以像下面添加一个拦截器。

 client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // try the request Response response = chain.proceed(request); int tryCount = 0; int maxLimit = 3; //Set your max limit here while (!response.isSuccessful() && tryCount < maxLimit) { Log.d("intercept", "Request failed - " + tryCount); tryCount++; // retry the request response = chain.proceed(request); } // otherwise just pass the original response on return response; } }); 

有关interceptos的更多细节可以在这里find。