studio programacion para móviles libro edición desarrollo curso aplicaciones java android timeout retrofit

java - para - manual de programacion android pdf



¿Cómo configurar el tiempo de espera en la biblioteca Retrofit? (9)

Estoy usando la biblioteca Retrofit en mi aplicación, y me gustaría establecer un tiempo de espera de 60 segundos. ¿Retrofit tiene 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?


Encontré este ejemplo

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

Aquí configuramos el cliente de conexión de cliente de url personalizado antes de construir la implementación del servicio de descanso 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> T buildClient(final Class<T> 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; } }


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 para 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.


Estas respuestas estaban desactualizadas 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> S createService(Class<S> 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, agréguelo 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 obtener un JSON , simplemente elimínelo del código anterior.

.setConverter(new SimpleXMLConverter())


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

.setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build()))


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

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

1. Agregar la dependencia de la biblioteca

En build.gradle, incluya esta línea:

compile ''com.squareup.okhttp:okhttp:x.x.x''

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, haga lo siguiente para Retrofit antes de la versión 2 y Okhttp antes de la versión 3 ( PARA LAS VERSIONES MÁS NUEVAS, VEA LOS EDITOS )

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

EDITAR 1

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

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

Y configure el cliente usando el patrón de construcción:

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

Más información en Timeouts de Timeouts

EDITAR 2

Las versiones de 2.xx desde 2.xx también usan el patrón de construcción, así que cambie el bloque de retorno anterior a esto:

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

Si usa un código como mi método provideRestAdapter, cambie el tipo de retorno del método a Retrofit .

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

ps: si tu minSdkVersion es mayor que 8, puedes usar TimeUnit.MINUTES :

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

Para más detalles sobre las unidades, vea TimeUnit .


public class ApiClient { private static Retrofit retrofit = null; private static final Object LOCK = new Object(); public static void clear() { synchronized (LOCK) { retrofit = null; } } public static Retrofit getClient() { synchronized (LOCK) { if (retrofit == null) { Gson gson = new GsonBuilder() .setLenient() .create(); OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(40, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .build(); retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(Constants.WEB_SERVICE) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); } return retrofit; } } public static RequestBody plain(String content) { return getRequestBody("text/plain", content); } public static RequestBody getRequestBody(String type, String content) { return RequestBody.create(MediaType.parse(type), content); } } @FormUrlEncoded @POST("architect/project_list_Design_files") Call<DesignListModel> getProjectDesign( @Field("project_id") String project_id); @Multipart @POST("architect/upload_design") Call<BoqListModel> getUpLoadDesign( @Part("user_id") RequestBody user_id, @Part("request_id") RequestBody request_id, @Part List<MultipartBody.Part> image_file, @Part List<MultipartBody.Part> design_upload_doc); private void getMyProjectList() { ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call<MyProjectListModel> call = apiService.getMyProjectList("",Sorting,latitude,longitude,Search,Offset+"",Limit); call.enqueue(new Callback<MyProjectListModel>() { @Override public void onResponse(Call<MyProjectListModel> call, Response<MyProjectListModel> response) { try { Log.e("response",response.body()+""); } catch (Exception e) { Log.e("onResponse: ", e.toString()); } } @Override public void onFailure(Call<MyProjectListModel> call, Throwable t) { Log.e( "onFailure: ",t.toString()); } }); } // file upload private void getUpload(String path,String id) { ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); MultipartBody.Part GalleryImage = null; if (path!="") { File file = new File(path); RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); GalleryImage = MultipartBody.Part.createFormData("image", file.getName(), reqFile); } RequestBody UserId = RequestBody.create(MediaType.parse("text/plain"), id); Call<uplod_file> call = apiService.geUplodFileCall(UserId,GalleryImage); call.enqueue(new Callback<uplod_file>() { @Override public void onResponse(Call<uplod_file> call, Response<uplod_file> response) { try { Log.e("response",response.body()+""); Toast.makeText(getApplicationContext(),response.body().getMessage(),Toast.LENGTH_SHORT).show(); } catch (Exception e) { Log.e("onResponse: ", e.toString()); } } @Override public void onFailure(Call<uplod_file> call, Throwable t) { Log.e( "onFailure: ",t.toString()); } }); } implementation ''com.squareup.retrofit2:retrofit:2.4.0'' implementation ''com.squareup.retrofit2:converter-gson:2.4.0''


public class ApiClient { private static Retrofit retrofit = null; private static final Object LOCK = new Object(); public static void clear() { synchronized (LOCK) { retrofit = null; } } public static Retrofit getClient() { synchronized (LOCK) { if (retrofit == null) { Gson gson = new GsonBuilder() .setLenient() .create(); OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(40, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .build(); // Log.e("jjj", "=" + (MySharedPreference.getmInstance().isEnglish() ? Constant.WEB_SERVICE : Constant.WEB_SERVICE_ARABIC)); retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(Constants.WEB_SERVICE) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); } return retrofit; }`enter code here` } public static RequestBody plain(String content) { return getRequestBody("text/plain", content); } public static RequestBody getRequestBody(String type, String content) { return RequestBody.create(MediaType.parse(type), content); } } ------------------------------------------------------------------------- implementation ''com.squareup.retrofit2:retrofit:2.4.0'' implementation ''com.squareup.retrofit2:converter-gson:2.4.0''


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