¿Cómo establecer el tiempo de espera en la biblioteca de modificación?

Estoy usando la biblioteca Retrofit en mi aplicación, y me gustaría establecer un tiempo de espera de 60 segundos. ¿Tiene Retrofit alguna forma de hacer esto?

Configuré Retrofit de esta manera:

RestAdapter restAdapter = new RestAdapter.Builder() .setServer(BuildConfig.BASE_URL) .setConverter(new GsonConverter(gson)) .build(); 

¿Cómo puedo configurar el tiempo de espera?

    Puede establecer tiempos de espera en el cliente HTTP subyacente. Si no especifica un cliente, Retrofit creará uno con los tiempos de espera de conexión y lectura predeterminados. Para establecer sus propios tiempos de espera, necesita configurar su propio cliente y suministrarlo al RestAdapter.Builder .

    Una opción es usar el cliente OkHttp , también desde Square.

    1. Agregue la dependencia de la biblioteca

    En build.gradle, incluya esta línea:

     compile 'com.squareup.okhttp:okhttp:xxx' 

    Donde xxx es la versión de biblioteca deseada.

    2. Establecer el cliente

    Por ejemplo, si desea establecer un tiempo de espera de 60 segundos, hágalo de esta manera para Retrofit antes de la versión 2 y Okhttp antes de la versión 3 ( PARA LAS VERSIONES MÁS NUEVAS, VEA LAS EDICIONES ):

     public RestAdapter providesRestAdapter(Gson gson) { final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(60, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS); return new RestAdapter.Builder() .setEndpoint(BuildConfig.BASE_URL) .setConverter(new GsonConverter(gson)) .setClient(new OkClient(okHttpClient)) .build(); } 

    EDIT 1

    Para las versiones de okhttp desde 3.xx , debe establecer la dependencia de esta manera:

     compile 'com.squareup.okhttp3:okhttp:xxx' 

    Y configure al cliente usando el patrón del generador:

     final OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(60, TimeUnit.SECONDS) .connectTimeout(60, TimeUnit.SECONDS) .build(); 

    Más información en tiempos de espera


    EDIT 2

    Las versiones de 2.xx desde 2.xx también usan el patrón del generador, por lo tanto, cambie el bloque de retorno anterior a este:

     return new Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build(); 

    Si utiliza un código como el método de my provideRestAdapter, cambie el tipo de devolución del método a Retrofit .

    Más información en Retrofit 2 – Guía de actualización de 1.9


    ps: si su minSdkVersion es mayor que 8, puede usar TimeUnit.MINUTES :

     okHttpClient.setReadTimeout(1, TimeUnit.MINUTES); okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES); 

    Para obtener más detalles sobre las unidades, consulte TimeUnit .

    Estas respuestas fueron obsoletas para mí, así que así es como funcionó.

    Agregue OkHttp, en mi caso, la versión es 3.3.1 :

     compile 'com.squareup.okhttp3:okhttp:3.3.1' 

    Luego, antes de construir su Retrofit, haga esto:

     OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .build(); return new Retrofit.Builder() .baseUrl(baseUrl) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build(); 

    Estoy usando Retrofit 1.9 para obtener un XML .

     public class ServicioConexionRetrofitXML { public static final String API_BASE_URL = new GestorPreferencias().getPreferencias().getHost(); public static final long tiempoMaximoRespuestaSegundos = 60; public static final long tiempoMaximoLecturaSegundos = 100; public static final OkHttpClient clienteOkHttp = new OkHttpClient(); private static RestAdapter.Builder builder = new RestAdapter.Builder(). setEndpoint(API_BASE_URL). setClient(new OkClient(clienteOkHttp)).setConverter(new SimpleXMLConverter()); public static  S createService(Class serviceClass) { clienteOkHttp.setConnectTimeout(tiempoMaximoRespuestaSegundos, TimeUnit.SECONDS); clienteOkHttp.setReadTimeout(tiempoMaximoLecturaSegundos, TimeUnit.SECONDS); RestAdapter adapter = builder.build(); return adapter.create(serviceClass); } } 

    Si está utilizando Retrofit 1.9.0 y okhttp 2.6.0, agregue a su archivo Gradle.

      compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.6.0' // Librería de retrofit para XML converter (Simple) Se excluyen grupos para que no entre // en conflicto. compile('com.squareup.retrofit:converter-simplexml:1.9.0') { exclude group: 'xpp3', module: 'xpp3' exclude group: 'stax', module: 'stax-api' exclude group: 'stax', module: 'stax' } 

    Nota: si necesita recuperar un JSON , simplemente elimine el código anterior.

     .setConverter(new SimpleXMLConverter()) 

    Para Retrofit1.9 con los usuarios de OkHttp3, aquí está la solución,

     .setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build())) 
     public class ApiModule { public WebService apiService(Context context) { String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url); HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE); OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(120, TimeUnit.SECONDS) .writeTimeout(120, TimeUnit.SECONDS) .connectTimeout(120, TimeUnit.SECONDS) .addInterceptor(loggingInterceptor) //.addNetworkInterceptor(networkInterceptor) .build(); return new Retrofit.Builder().baseUrl(mBaseUrl) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build().create(WebService.class); } } 

    Esta será la mejor manera de establecer el tiempo de espera para cada servicio (pasar el tiempo de espera como parámetro)

     public static Retrofit getClient(String baseUrl, int serviceTimeout) { Retrofit retrofitselected = baseUrl.contains("http:") ? retrofit : retrofithttps; if (retrofitselected == null || retrofitselected.equals(retrofithttps)) { retrofitselected = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(getGson().create())) .client(!BuildConfig.FLAVOR.equals("PRE") ? new OkHttpClient.Builder() .addInterceptor(new ResponseInterceptor()) .connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS) .writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS) .readTimeout(serviceTimeout, TimeUnit.MILLISECONDS) .build() : getUnsafeOkHttpClient(serviceTimeout)) .build(); } return retrofitselected; } 

    Y no te pierdas esto por OkHttpClient.

     private static OkHttpClient getUnsafeOkHttpClient(int serviceTimeout) { try { // Create a trust manager that does not validate certificate chains final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; } } }; // Install the all-trusting trust manager final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory); builder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); OkHttpClient okHttpClient = builder .addInterceptor(new ResponseInterceptor()) .connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS) .writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS) .readTimeout(serviceTimeout, TimeUnit.MILLISECONDS) .build(); return okHttpClient; } catch (Exception e) { throw new RuntimeException(e); } } 

    Espero que esto ayude a cualquiera.

    Encontré este ejemplo

    https://github.com/square/retrofit/issues/1557

    Aquí establecemos un cliente de conexión de cliente de url personalizado antes de construir la implementación de servicio de rest de API.

     import com.google.gson.Gson import com.google.gson.GsonBuilder import retrofit.Endpoint import retrofit.RestAdapter import retrofit.client.Request import retrofit.client.UrlConnectionClient import retrofit.converter.GsonConverter class ClientBuilder { public static  T buildClient(final Class client, final String serviceUrl) { Endpoint mCustomRetrofitEndpoint = new CustomRetrofitEndpoint() Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() RestAdapter.Builder builder = new RestAdapter.Builder() .setEndpoint(mCustomRetrofitEndpoint) .setConverter(new GsonConverter(gson)) .setClient(new MyUrlConnectionClient()) RestAdapter restAdapter = builder.build() return restAdapter.create(client) } } public final class MyUrlConnectionClient extends UrlConnectionClient { @Override protected HttpURLConnection openConnection(Request request) { HttpURLConnection connection = super.openConnection(request); connection.setConnectTimeout(15 * 1000); connection.setReadTimeout(30 * 1000); return connection; } }