OkHttp/Retrofit默认超时时间

56

我想知道我的Retrofit客户端应该设置多少秒。

  1. 默认超时时间应该设置为多少秒?
  2. OkHttp/Retrofit的默认超时时间是多少,我们应该使用默认值吗?
5个回答

79
  1. 并不存在一种“魔法值”,这取决于您对后端的期望。如果有人告诉您5秒是一个好的值,而您的某个端点在最大负载时间下平均需要8秒,则8秒对您来说就不起作用。通常情况下,我看到的值是10秒以下被认为是短的,10秒至20秒之间是常见的。

  1. OkHttp 3.4.1Retrofit 2.1.0开始,OkHttp 的默认值为10秒。Retrofit 依赖于 OkHttp 的默认值。

Retrofit 代码片段:(如果您没有提供 OkHttpClient):

  okhttp3.Call.Factory callFactory = this.callFactory;
  if (callFactory == null) {
    callFactory = new OkHttpClient();
  }

OkHttp代码片段:

  connectTimeout = 10_000;
  readTimeout = 10_000;
  writeTimeout = 10_000;

  1. 我唯一能访问的谷歌应用是Google IO应用。

他们使用不同的值。例如,对于与反馈相关的内容,他们使用:

public class FeedbackConstants{

    public static final int FEEDBACK_CONNECT_TIMEOUT_MS = 15000;

    public static final int FEEDBACK_READ_TIMEOUT_MS = 15000;

    public static final int GOOGLE_API_CLIENT_CONNECTION_TIMEOUT_S = 10;
}

他们正在使用Volley,你可以参考一些超时时间,它们看起来确实很短。

/** The default socket timeout in milliseconds */
    public static final int DEFAULT_TIMEOUT_MS = 2500;
在一个不同的HTTP客户端中,他们提供了一些线索,关于他们认为什么是合适的短超时时间。
    /**
     * Default 2s, deliberately short. If you need longer, you should be using
     * {@link AsyncHttpClient} instead.
     */
    protected int connectionTimeout = 2000;
    /**
     * Default 8s, reasonably short if accidentally called from the UI thread.
     */
    protected int readTimeout = 8000;

26
  1. 我认为它不应该太久也不应该太短。在我看来,应该介于10秒到30秒之间。
  2. 如果您没有明确指定HTTP客户端,Retrofit默认的连接超时设置为15秒。
OkHttpClient defaultClient() {   
    OkHttpClient client = new OkHttpClient();
    client.setConnectTimeout(15, TimeUnit.SECONDS);
    client.setReadTimeout(15, TimeUnit.SECONDS);
    client.setWriteTimeout(15, TimeUnit.SECONDS);
    return client;
}
  1. 我有一种感觉,谷歌正在使用30秒。不确定。

应该将 client.setConnectTimeout(15, TimeUnit.SECONDS); 修改为 client.setConnectTimeout(15L, TimeUnit.SECONDS); 吗? - John

3

您可以使用

OkHttpClient okHttpClient = new OkHttpClient.Builder()  
        .connectTimeout(1, TimeUnit.MINUTES)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(15, TimeUnit.SECONDS)
        .build();

Retrofit.Builder builder = new Retrofit.Builder()  
        .baseUrl("http://10.0.2.2:3000/")
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create());

更多细节,请前往:https://futurestud.io/tutorials/retrofit-2-customize-network-timeouts



0

我在我的RetrofitApiClient中这样使用它。Okhttp版本为3.4.1

public class RetrofitApiClient {

         private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
                .connectTimeout(15, TimeUnit.SECONDS)
                .readTimeout(15L, TimeUnit.SECONDS)
                .writeTimeout(15L, TimeUnit.SECONDS);

        public  void someMethod() {
            OkHttpClient client = httpClient.build();
        }
}

而为什么是15秒? - Daniel Gomez Rico
4
为什么15秒:他只是从一些教程网站上复制了代码,因此他分享了代码但没有解释。更重要的是,我认为他没有回答问题所在的语境。 - Pravinsingh Waghela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接