How to set connection timeout with OkHttp

后端 未结 11 673
一向
一向 2020-11-27 10:32

I am developing app using OkHttp library and my trouble is I cannot find how to set connection timeout and socket timeout.

OkHttpClient client = new OkHttpCl         


        
相关标签:
11条回答
  • 2020-11-27 10:41

    OkHttp Version:3.11.0 or higher

    From okhttp source code:

    /**
     * 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 can be any value of below

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

    example code

    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();
    }
    

    Updated

    I have add new API to OkHttp from version 3.12.0, you can set timeout like this:

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

    NOTE: This requires API 26+ so if you support older versions of Android, continue to use (5, TimeUnit.SECONDS).

    0 讨论(0)
  • 2020-11-27 10:41

    This worked for me:

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

    Source: https://github.com/square/okhttp/issues/3553

    0 讨论(0)
  • 2020-11-27 10:41

    If you want to customize the configuration then use the below methodology of creating OKhttpclient first and then add builder on top of it.

    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);
    }
    
    0 讨论(0)
  • 2020-11-27 10:47

    For Retrofit 2.0.0-beta1 or beta2, the code goes as follows:

    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();
    
    0 讨论(0)
  • 2020-11-27 10:50

    For Retrofit retrofit:2.0.0-beta4 the code goes as follows:

    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();
    
    0 讨论(0)
  • 2020-11-27 10:50

    Adding in gradle file and sync project:

    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.google.code.gson:gson:2.6.2'
    

    Adding in Java class:

    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();
    
    0 讨论(0)
提交回复
热议问题