Cómo establecer tiempo de espera de conexión con OkHttp

Estoy desarrollando una aplicación a través de OkHttp biblioteca y mi problema es que no puedo encontrar la forma para establecer el tiempo de espera de conexión y tiempo de espera del socket.

OkHttpClient client = new OkHttpClient();

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

Response response = client.newCall(request).execute();
  • La respuesta seleccionada no es válida. Tal vez usted debe editar pregunta para especificar la versión de okhttp.
InformationsquelleAutor kelvincer | 2014-09-20

11 Kommentare

  1. 300

    Usted simplemente tiene que hacer este

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

    Ser consciente de que el valor establecido en setReadTimeout es el utilizado en setSoTimeout en el Socket internamente en el OkHttp Conexión clase.

    No establecer ningún tiempo de espera en la OkHttpClient es el equivalente de la configuración de un valor de 0 en setConnectTimeout o setReadTimeout y resultará en ningún tiempo de espera. Puede encontrar una descripción aquí.

    Como lo menciona @marceloquinta en los comentarios setWriteTimeout también se puede ajustar.

    A partir de la versión 2.5.0 de lectura /escritura /connect valores de tiempo de espera de 10 segundos por defecto, como se ha mencionado por @ChristerNordvik. Esto puede ser visto aquí.

    Como de OkHttp3 ahora puede hacer esto a través de la El generador de como

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

    También puedes ver la receta aquí.

    • Hola, bueno, pero cómo establecer el tiempo de espera del socket?
    • He actualizado mi respuesta para solucionar esto, saludos!
    • Gracias por su tiempo
    • Gracias, muy útil! 😀
    • Es allí una manera de establecer los tiempo de espera diferente para cada solicitud (cada solicitud tiene el mismo cliente estático)?
    • Usted puede poner un tiempo de espera para cada petición : Aquí algo de información : github.com/square/okhttp/wiki/Recipes
    • Si no hay tiempo de espera se ha establecido , hay un tiempo de espera predeterminado o ningún tiempo de espera ?
    • He actualizado la respuesta con la información. Buena suerte!
    • No olvides que el tiempo de espera ESCRITURA: el cliente.setWriteTimeout(10, TimeUnit.SEGUNDOS);
    • Sólo para tu INFORMACIÓN, OkHttp cambiado en 2.5.0 a tener un valor predeterminado de tiempo de espera de 10 segundos.
    • si client.call(...) mismo tiempo se acabe. Se detiene mi de todo el ciclo. Si el tiempo de las llamadas, tengo que romper y continuar con el bucle.
    • Anticuado Respuesta
    • hay tiempos de espera predeterminados. 10 segundos para conectarse y 10 segundos para la lectura. Consulte la documentación: plaza.github.io/okhttp/3.x/okhttp/okhttp3/…

  2. 125

    Para okhttp3 esto ha cambiado un poco.

    Ahora de configurar los tiempos de utilizar el constructor, y no incubadoras, como este:

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

    Más información se puede encontrar en su wiki:
    https://github.com/square/okhttp/blob/master/RECIPES.md#timeouts

  3. 11

    Para la modificación de reconversión: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();
  4. 9

    De actualización 2.0.0 beta 1 o beta 2, 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();
  5. 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();
  6. 5

    De lo que ha cambiado ahora. Reemplazar .Builder() con .newBuilder()

    Como 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();
  7. 4

    así:

    //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();
  8. 4

    okhttp versión:3.11.0 o superior

    de okhttp código fuente

    /**
     * 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 a continuación

    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 agregar nueva api para okhttp a partir de la versión 3.12.0, puede establecer el tiempo de espera como este:

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

    NOTA: Esto requiere de la API de 26+ así que si usted compatibilidad con versiones antiguas de Android, continuar el uso de (5, TimeUnit.SECONDS).

  9. 2

    Si desea personalizar la configuración, a continuación, utilizar la siguiente metodología de creación de OKhttpclient primero y, a continuación, agregue el generador en la parte superior de la misma.

    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);
        }
  10. 0

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

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea