Cómo configurar el tiempo de espera de conexión con OkHttp


173

Estoy desarrollando una aplicación usando la biblioteca OkHttp y mi problema es que no puedo encontrar cómo configurar el tiempo de espera de conexión y el tiempo de espera del socket.

OkHttpClient client = new OkHttpClient();

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

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

2
La respuesta que seleccionó ya no es válida. Tal vez debería editar la pregunta para especificar la versión de okhttp.
Theyouthis

Respuestas:


324

Simplemente tienes que hacer esto

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

Tenga en cuenta que el valor fijado en setReadTimeoutes el utilizado en setSoTimeoutel Socketinterior de la OkHttp Connectionclase.

No establecer un tiempo de espera en el OkHttpClientes el equivalente a establecer un valor de 0en setConnectTimeouto setReadTimeouty no dará lugar a ningún tiempo de espera. La descripción se puede encontrar aquí .

Como mencionó @marceloquinta en los comentarios setWriteTimeout, también se puede configurar.

A partir de la versión 2.5.0, los valores de tiempo de espera de lectura / escritura / conexión se establecen en 10 segundos de forma predeterminada, como lo menciona @ChristerNordvik. Esto se puede ver aquí .

A partir de ahora OkHttp3 puede hacerlo a través del constructor como tal

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

También puedes ver la receta aquí .


66
¿Hay alguna manera de establecer esos tiempos de espera diferentes para cada solicitud (cada solicitud tiene el mismo cliente estático)?
StErMi

3
Puede establecer un tiempo de espera específico para cada solicitud: Aquí hay información: github.com/square/okhttp/wiki/Recipes
Tobliug

3
No olvide el tiempo de espera de ESCRITURA: client.setWriteTimeout (10, TimeUnit.SECONDS);
marceloquinta

77
@MiguelLavigne Solo para tu información, OkHttp cambió en 2.5.0 para tener un tiempo de espera predeterminado de 10 segundos.
Christer Nordvik

55
Respuesta desactualizada
devDeejay


12

Para Retrofit retrofit: 2.0.0-beta4, el código es el siguiente

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

Para Retrofit 2.0.0-beta1 o beta2, el código es el siguiente

    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

Ha cambiado ahora. Reemplazar .Builder()con.newBuilder()

A partir de okhttp: 3.9.0, el código es el siguiente:

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

5

versión okhttp:3.11.0 o superior

del código fuente de 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 puede ser cualquier valor de abajo

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

código de ejemplo

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

Actualizado

He agregado una nueva api a okhttp desde la versión 3.12.0, puede configurar el tiempo de espera de esta manera:

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

NOTA: Esto requiere API 26+, por lo que si admite versiones anteriores de Android, continúe usándolo (5, TimeUnit.SECONDS).


4

al igual que:

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

esto funcionó para mí ... de 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();

2

Si desea personalizar la configuración, use primero la metodología siguiente para crear OKhttpclient y luego agregue el generador encima.

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

Puede establecer un tiempo de espera de llamada para cubrir todo el ciclo desde la resolución de DNS, la conexión, la escritura del cuerpo de la solicitud, el procesamiento del servidor y la lectura del cuerpo de la respuesta.

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.