【问题标题】:OkHttp/Retrofit default timeoutOkHttp/Retrofit 默认超时
【发布时间】:2015-08-26 08:40:54
【问题描述】:

我想知道我应该为我的改造客户设置多少秒。

  1. 我应该使用多少秒作为默认超时?
  2. OkHttp/Retrofit 的默认超时是多少,我们应该让默认值吗?

【问题讨论】:

    标签: android timeout httprequest retrofit okhttp


    【解决方案1】:
    1. 没有神奇的价值,取决于您对后端的期望。如果有人告诉您 5s 是一个很好的价值,并且您在最大加载时间的一个端点上平均有 8s,那么 8s 不适合您。作为一般值,我发现 10s 以下被认为是短的,而 10s 到 20s 之间是常见的。

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

    改造代码sn-p:(如果你不提供OkHttpClient):

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

    OkHttp 代码 sn-p:

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

    1. 我唯一可以访问的 Google 应用是 Google IO 应用。

    他们使用不同的值。例如对于feedback 相关的他们使用:

    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,而你 can take a look 也有一些超时。是的,它们看起来很短。

    /** The default socket timeout in milliseconds */
        public static final int DEFAULT_TIMEOUT_MS = 2500;
    

    different http client 中,他们会为您提供一些线索,说明他们认为什么是短暂且合理的短暂超时。

        /**
         * 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;
    

    【讨论】:

      【解决方案2】:
      1. 它不应该永远持续,也不应该太短。恕我直言,它应该在 10 到 30 秒之间。
      2. Retrofit 为您提供的默认连接超时设置(如果您没有明确指定 http 客户端)为 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. 我感觉 Google 使用了 30 秒。不确定。

      【讨论】:

      • 应该client.setConnectTimeout(15, TimeUnit.SECONDS);client.setConnectTimeout(15L, TimeUnit.SECONDS); 吗?
      【解决方案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

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        我在我的 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 秒?
        • 为什么是 15 秒:很简单,就像他从某个教程网站上复制的一样。因此他分享了他的代码并且没有解释。更重要的是,我认为他没有在被问到的上下文中回答这个问题。
        猜你喜欢
        • 2014-03-01
        • 1970-01-01
        • 2012-02-12
        • 2012-07-17
        • 2010-11-23
        • 2017-12-25
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多