【问题标题】:How to disable retries for one connection with OkHttp?如何使用 OkHttp 禁用一次连接的重试?
【发布时间】:2015-10-15 18:54:06
【问题描述】:

我正在使用 OkHttp 并希望禁用特定 api 调用的连接重试。这是正确的做法吗?:

mMyGlobalClient = new OkHttpClient();

....

public void makeConnection(...) {

    OkHttpClient client = null;
    if (disableRetries) {
        OkHttpClient clone = mMyGlobalClient.clone();
        clone.setRetryOnConnectionFailure(false);
        client = clone;
    } else {
        client = mMyGlobalClient;
    }

    client.newCall(...);
}

这个想法来自这篇文章:

https://github.com/square/okhttp/pull/1259#issue-53157152

大多数应用程序不希望全局禁用重试。相反,使用 clone() 为特定的非幂等请求获取 OkHttpClient, 然后使用该设置配置该客户端。

我想禁用重试这个调用的原因是因为如果它被我的服务器处理两次,它可能是破坏性的:

https://github.com/square/okhttp/pull/1259#issuecomment-68430264

谢谢

【问题讨论】:

    标签: android okhttp


    【解决方案1】:

    是的,这是正确的方法。

    顺便说一句,如果你不介意,你可以写得简单一点

    mMyGlobalClient = new OkHttpClient();
    
    ....
    
    public void makeConnection(...) {
    
        OkHttpClient client = null;
        if (disableRetries) {
            client = mMyGlobalClient.clone();
            client.setRetryOnConnectionFailure(false);
        } else {
            client = mMyGlobalClient;
        }
    
        client.newCall(...);
    }
    

    【讨论】:

    • 如果我们想挑剔,空赋值也是没用的,因为克隆调用不是长时间运行的。 :p
    • 是的,我只是想让 Q 尽可能清晰
    【解决方案2】:

    另外,我已经解决了retrofit2中的问题。

    为了防止重试,您必须使用带有 OkHttpClient 的 .retryOnConnectionFailure(false) 方法。

    示例代码:

    OkHttpClient okHttpClient= null;
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(2, TimeUnit.MINUTES)
                    .readTimeout(2, TimeUnit.MINUTES)
                    .writeTimeout(2, TimeUnit.MINUTES)
                    .retryOnConnectionFailure(false)
                    .cache(null)//new Cache(sContext.getCacheDir(),10*1024*1024)
                    .build();
    

    在之前的版本有一些bug和改造后修复:2.1.0

    所以你应该使用retrofit2和okhttp3的更新版本:

    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    implementation 'com.squareup.okhttp3:okhttp:3.4.1' 
    

    问题讨论:

    https://github.com/square/okhttp/pull/1259#issuecomment-68430264

    【讨论】:

      【解决方案3】:

      使用call.cancel();

      final Call call = client.newCall(request);

      如果要限制重试次数,可以使用:

      if (responseCount(response) >= 3) {
          call.cancel(); // If we've failed 3 times, give up.
      }
      

      【讨论】:

        猜你喜欢
        • 2022-11-09
        • 2021-10-11
        • 2021-04-25
        • 2014-08-19
        • 2014-07-27
        • 2021-10-24
        • 2019-03-11
        • 1970-01-01
        相关资源
        最近更新 更多