Cách đặt thời gian chờ kết nối với OkHttp


173

Tôi đang phát triển ứng dụng bằng thư viện OkHttp và vấn đề của tôi là tôi không thể tìm thấy cách đặt thời gian chờ kết nối và thời gian chờ kết nối.

OkHttpClient client = new OkHttpClient();

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

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

2
Câu trả lời bạn chọn không còn giá trị. Có lẽ bạn nên chỉnh sửa câu hỏi để chỉ định phiên bản okhttp.
Họ

Câu trả lời:


324

Bạn chỉ cần làm điều này

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

Hãy nhận biết rằng giá trị thiết lập trong setReadTimeoutlà một trong những sử dụng trong setSoTimeouttrên Sockettrong nội bộ trong OkHttp Connectionlớp.

Không đặt bất kỳ thời gian chờ nào trên OkHttpClientlà tương đương với việc đặt giá trị 0bật setConnectTimeouthoặc setReadTimeoutsẽ không có thời gian chờ nào cả. Mô tả có thể được tìm thấy ở đây .

Như @marceloquinta đã đề cập trong các bình luận setWriteTimeoutcũng có thể được đặt.

Kể từ phiên bản 2.5.0, giá trị thời gian chờ đọc / ghi / kết nối được đặt thành 10 giây theo mặc định như được đề cập bởi @ChristerNordvik. Điều này có thể được nhìn thấy ở đây .

Tính đến OkHttp3 bây giờ có thể làm được điều này thông qua việc Builder như vậy

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

Bạn cũng có thể xem công thức ở đây .


6
Có cách nào để đặt các thời gian chờ khác nhau cho mỗi yêu cầu (mỗi yêu cầu có cùng một máy khách tĩnh) không?
StErMi

3
Bạn có thể đặt thời gian chờ cụ thể cho từng yêu cầu: Tại đây một số thông tin: github.com/sapes/okhttp/wiki/Recipes
Tobliug 11/2/2015

3
Đừng quên thời gian chờ VIẾT: client.setWriteTimeout (10, TimeUnit.SECONDS);
marceloquinta

7
@MiguelLavigne Chỉ cần FYI, OkHttp đã thay đổi trong 2.5.0 để có thời gian chờ mặc định là 10 giây.
Christer Nordvik

5
Câu trả lời lỗi thời
devDeejay

143

Đối với okhttp3 điều này đã thay đổi một chút.

Bây giờ bạn thiết lập thời gian bằng cách sử dụng trình tạo, chứ không phải setters, như thế này:

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

Thông tin thêm có thể được tìm thấy trong wiki của họ: https://github.com/sapes/okhttp/blob/b3dcb9b1871325248fba917458658628c44ce8a3/docs/recipes.md#timeouts-kt-java


12

Đối với trang bị thêm trang bị thêm: 2.0.0-beta4, mã được thực hiện như sau

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

9

Đối với Retrofit 2.0.0-beta1 hoặc beta2, mã đi như sau

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

5

Bây giờ nó đã thay đổi. Thay thế .Builder()bằng.newBuilder()

Kể từ okhttp: 3.9.0 , mã như sau:

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

5

phiên bản okhttp: 3.11.0hoặc cao hơn

từ mã nguồn 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 có thể là bất kỳ giá trị nào dưới đây

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

mã ví dụ

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

Đã cập nhật

Tôi đã thêm api mới vào okhttp từ phiên bản 3.12.0, bạn có thể đặt thời gian chờ như thế này:

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

LƯU Ý: Điều này yêu cầu API 26+ vì vậy nếu bạn hỗ trợ các phiên bản Android cũ hơn, hãy tiếp tục sử dụng (5, TimeUnit.SECONDS).


4

như vậy

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

cái này hiệu quả với tôi ... từ https://github.com/sapes/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();

2

Nếu bạn muốn tùy chỉnh cấu hình thì hãy sử dụng phương pháp dưới đây để tạo OKhttpclient trước rồi thêm trình xây dựng lên trên nó.

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

1

Bạn có thể đặt thời gian chờ cuộc gọi để bao quát toàn bộ chu trình từ việc giải quyết DNS, kết nối, viết phần thân yêu cầu, xử lý máy chủ và đọc phần thân phản hồi.

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.