首页 文章

如何使用OkHttp设置连接超时

提问于
浏览
139

我正在使用OkHttp库开发app,我的麻烦是我找不到如何设置连接超时和套接字超时 .

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url).build();

Response response = client.newCall(request).execute();

谢谢 .

10 回答

  • 9

    它现在改变了 . 用 .newBuilder() 替换 .Builder()

    截至 okhttp:3.9.0 ,代码如下:

    OkHttpClient okHttpClient = new OkHttpClient()
        .newBuilder()
        .connectTimeout(10,TimeUnit.SECONDS)
        .writeTimeout(10,TimeUnit.SECONDS)
        .readTimeout(30,TimeUnit.SECONDS)
        .build();
    
  • 114

    像这样:

    //New Request
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
            final OkHttpClient client = new OkHttpClient.Builder()
                    .addInterceptor(logging)
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(30, TimeUnit.SECONDS)
                    .build();
    
  • 4

    对于Retrofit 2.0.0-beta1或beta2,代码如下

    OkHttpClient client = new OkHttpClient();
    
        client.setConnectTimeout(30, TimeUnit.SECONDS);
        client.setReadTimeout(30, TimeUnit.SECONDS);
        client.setWriteTimeout(30, TimeUnit.SECONDS);
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://api.yourapp.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    
  • 7
    //add in gradle and sync
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.google.code.gson:gson:2.6.2'
    
    import okhttp3.OkHttpClient;
    import okhttp3.OkHttpClient.Builder;
    
    
    Builder b = new Builder();
    b.readTimeout(200, TimeUnit.MILLISECONDS);
    b.writeTimeout(600, TimeUnit.MILLISECONDS);
    // set other properties
    
    OkHttpClient client = b.build();
    
  • 2

    你只需要这样做

    OkHttpClient client = new OkHttpClient();
    client.setConnectTimeout(15, TimeUnit.SECONDS); // connect timeout
    client.setReadTimeout(15, TimeUnit.SECONDS);    // socket timeout
    
    Request request = new Request.Builder().url(url).build();
    Response response = client.newCall(request).execute();
    

    请注意, setReadTimeout 中设置的值是 OkHttp Connection类内部 Socket 上的 setSoTimeout 中使用的值 .

    不在 OkHttpClient 上设置任何超时相当于在 setConnectTimeoutsetReadTimeout 上设置 0 的值,并且根本不会导致超时 . 描述可以找到here .

    正如@marceloquinta在评论中提到的 setWriteTimeout 也可以设置 .

    从版本2.5.0开始,默认情况下,如@ChristerNordvik所述,读/写/连接超时值设置为10秒 . 这可以看作here .

    从OkHttp3开始,现在可以通过Builder这样做

    client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();
    

    你也可以查看食谱here

  • 4

    对于okhttp3,这已经改变了一点 .

    现在您使用构建器设置时间,而不是设置器,如下所示:

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();
    

    更多信息可以在他们的维基中找到:https://github.com/square/okhttp/wiki/Recipes#timeouts

  • 11

    对于Retrofit改造:2.0.0-beta4,代码如下

    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(logging)
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .build();
    
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.yourapp.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
    
  • 4

    这对我有用...来自https://github.com/square/okhttp/issues/3553

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .retryOnConnectionFailure(false) <-- not necessary but useful!
            .build();
    
  • 273

    okhttp版本: 3.11.0 或更高版本

    来自okhttp的源代码

    /**
     * Sets the default connect timeout for new connections. A value of 0 means no timeout,
     * otherwise values must be between 1 and {@link Integer#MAX_VALUE} when converted to
     * milliseconds.
     *
     * <p>The connectTimeout is applied when connecting a TCP socket to the target host.
     * The default value is 10 seconds.
     */
    public Builder connectTimeout(long timeout, TimeUnit unit) {
      connectTimeout = checkDuration("timeout", timeout, unit);
      return this;
    }
    

    unit 可以是以下任何值

    TimeUnit.NANOSECONDS
    TimeUnit.MICROSECONDS
    TimeUnit.MILLISECONDS
    TimeUnit.SECONDS
    TimeUnit.MINUTES
    TimeUnit.HOURS
    TimeUnit.DAYS
    

    示例代码

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(5000, TimeUnit.MILLISECONDS)/*timeout: 5 seconds*/
            .build();
    
    String url = "https://www.google.com";
    Request request = new Request.Builder()
            .url(url)
            .build();
    
    try {
        Response response = client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    更新

    我从版本 3.12.0 向okhttp添加了新的api,你可以像这样设置超时:

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(Duration.ofSeconds(5))/*timeout: 5 seconds*/
            .build();
    

    NOTE: 这需要API 26,因此如果您支持旧版Android,请继续使用 (5, TimeUnit.SECONDS) .

  • 5

    如果要自定义配置,请先使用以下方法创建OKhttpclient,然后在其上添加构建器 .

    private final OkHttpClient client = new OkHttpClient();
    
    // Copy to customize OkHttp for this request.
        OkHttpClient client1 = client.newBuilder()
            .readTimeout(500, TimeUnit.MILLISECONDS)
            .build();
        try (Response response = client1.newCall(request).execute()) {
          System.out.println("Response 1 succeeded: " + response);
        } catch (IOException e) {
          System.out.println("Response 1 failed: " + e);
        }
    

相关问题