Cara mengatur batas waktu koneksi dengan OkHttp

173

Saya mengembangkan aplikasi menggunakan pustaka OkHttp dan masalah saya adalah saya tidak dapat menemukan cara mengatur batas waktu koneksi dan batas waktu soket.

OkHttpClient client = new OkHttpClient();

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

Response response = client.newCall(request).execute();
kelvincer
sumber
2
Jawaban yang Anda pilih tidak lagi valid. Mungkin Anda harus mengedit pertanyaan untuk menentukan versi okhttp.
Theyouthis

Jawaban:

324

Anda hanya perlu melakukan ini

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

Sadarilah bahwa nilai yang ditetapkan setReadTimeoutadalah nilai yang digunakan setSoTimeoutpada Socketinternal di dalam OkHttp Connectionkelas.

Tidak mengatur batas waktu apa pun pada OkHttpClientadalah setara dengan menetapkan nilai 0aktif setConnectTimeoutatau setReadTimeoutdan tidak akan menghasilkan batas waktu sama sekali. Deskripsi dapat ditemukan di sini .

Seperti yang disebutkan oleh @marceloquinta dalam komentar setWriteTimeoutjuga dapat diatur.

Pada versi 2.5.0 nilai batas waktu baca / tulis / hubungkan diatur ke 10 detik secara default seperti yang disebutkan oleh @ChristerNordvik. Ini bisa dilihat di sini .

Pada OkHttp3 sekarang dapat melakukan ini melalui Builder seperti itu

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

Anda juga dapat melihat resepnya di sini .

Miguel Lavigne
sumber
6
Apakah ada cara untuk menetapkan batas waktu berbeda untuk setiap permintaan (setiap permintaan memiliki klien statis yang sama)?
StErMi
3
Anda dapat mengatur batas waktu spesifik untuk setiap permintaan: Berikut ini beberapa informasi: github.com/square/okhttp/wiki/Recipes
Tobliug
3
Jangan lupakan batas waktu WRITE: client.setWriteTimeout (10, TimeUnit.SECONDS);
marceloquinta
7
@MiguelLavigne Hanya FYI, OkHttp berubah dalam 2.5.0 untuk memiliki batas waktu default 10 detik.
Christer Nordvik
5
Jawaban
Kadaluarsa
143

Untuk okhttp3 ini telah sedikit berubah.

Sekarang Anda mengatur waktu menggunakan pembangun, dan bukan setter, seperti ini:

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

Info lebih lanjut dapat ditemukan di wiki mereka: https://github.com/square/okhttp/blob/b3dcb9b1871325248fba917458658628c44ce8a3/docs/recipes.md#timeouts-kt-java

Kaizie
sumber
12

Untuk retrofit retrofit: 2.0.0-beta4 kodenya sebagai berikut

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();
Sam
sumber
9

Untuk Retrofit 2.0.0-beta1 atau beta2, kodenya seperti berikut

    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();
xaxist
sumber
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();
Mohammad nabil
sumber
5

Sudah berubah sekarang. Ganti .Builder()dengan.newBuilder()

Pada okhttp: 3.9.0 kode berjalan sebagai berikut:

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

versi okhttp: 3.11.0atau lebih tinggi

dari kode sumber 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 dapat berupa nilai di bawah ini

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

contoh kode

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

Diperbarui

Saya telah menambahkan api baru ke okhttp dari versi 3.12.0, Anda dapat mengatur batas waktu seperti ini:

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

CATATAN: Ini membutuhkan API 26+ jadi jika Anda mendukung versi Android yang lebih lama, terus gunakan (5, TimeUnit.SECONDS).

shellhub
sumber
4

seperti itu:

//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();
Joolah
sumber
4

ini berhasil untuk saya ... dari 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();
rHenderson
sumber
2

Jika Anda ingin menyesuaikan konfigurasi maka gunakan metodologi di bawah ini untuk membuat OKhttpclient terlebih dahulu dan kemudian tambahkan builder di atasnya.

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);
    }
sandhya murugesan
sumber
1

Anda dapat mengatur batas waktu panggilan untuk mencakup seluruh siklus dari menyelesaikan DNS, menghubungkan, menulis isi permintaan, memproses server, dan membaca isi tanggapan.

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()
ChaturaM
sumber