Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit 2: Catch connection timeout exception

I have the following setup:

final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(5, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(5, TimeUnit.SECONDS);  RestAdapter.Builder builder = new RestAdapter.Builder()         .setEndpoint(ROOT)         .setClient(new OkClient(okHttpClient))         .setLogLevel(RestAdapter.LogLevel.FULL); 

I am trying to handle the situation in which my server is down and the user gets a connection timeout exception, this is my logging:

java.net.SocketTimeoutException: failed to connect to /192.168.0.53 (port 3000) after 5000ms 

Full logging: http://pastebin.com/gscCGb7x

Is there a way to route this into the retrofit failure method so I can handle it over there?

Thanks in advance!

like image 399
Jdruwe Avatar asked Apr 28 '15 13:04

Jdruwe


1 Answers

For Retrofit 2

Define a listener in your web service instance:

public interface OnConnectionTimeoutListener {     void onConnectionTimeout(); } 

Add an interceptor to your web service:

public WebServiceClient() {     OkHttpClient client = new OkHttpClient();     client.setConnectTimeout(10, TimeUnit.SECONDS);     client.setReadTimeout(30, TimeUnit.SECONDS);     client.interceptors().add(new Interceptor() {         @Override         public Response intercept(Chain chain) throws IOException {             return onOnIntercept(chain);         }     });     Retrofit retrofit = new Retrofit.Builder()             .baseUrl(BASE_URL)             .addConverterFactory(GsonConverterFactory.create())             .client(client)             .build();     webService = retrofit.create(WebService.class); } 

Enclose your intercep code with try-catch block and notify listener when exception happens:

private Response onOnIntercept(Chain chain) throws IOException {     try {         Response response = chain.proceed(chain.request());         String content = UtilityMethods.convertResponseToString(response);         Log.d(TAG, lastCalledMethodName + " - " + content);         return response.newBuilder().body(ResponseBody.create(response.body().contentType(), content)).build();     }     catch (SocketTimeoutException exception) {         exception.printStackTrace();         if(listener != null)             listener.onConnectionTimeout();     }      return chain.proceed(chain.request()); } 
like image 98
Olcay Ertaş Avatar answered Sep 23 '22 13:09

Olcay Ertaş