Retrofit e OkHttpClient, intercettano il timeout della connessione nel metodo di errore

Ho la seguente configurazione:

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

Sto cercando di gestire la situazione in cui il mio server non funziona e l’utente ottiene un’eccezione di timeout della connessione, questa è la mia registrazione:

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

Registrazione completa: http://pastebin.com/gscCGb7x

C’è un modo per instradare questo nel metodo di aggiornamento retrofit così posso gestirlo laggiù?

Grazie in anticipo!

Solutions Collecting From Web of "Retrofit e OkHttpClient, intercettano il timeout della connessione nel metodo di errore"

Per Retrofit 2

Definire un listener nell’istanza del servizio Web:

 public interface OnConnectionTimeoutListener { void onConnectionTimeout(); } 

Aggiungi un interceptor al tuo servizio web:

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

Allega il tuo codice di intercettazione con blocco try-catch e notifica al listener quando si verifica un’eccezione:

 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()); } 
  @Override public void onFailure(Call call, Throwable t) { if(t instanceof SocketTimeoutException){ message = "Socket Time out. Please try again."; } } 

Apparentemente l’eccezione viene inclusa in una RetrofitException in modo da poterla gestire nel metodo di errore.

È un po ‘più complicato. Con Retrofit puoi effettuare chiamate API che sono sincrone o asincrone.

Se il tuo endpoint restituisce void e ha una callback è asincrono. Se restituisce qualcosa e non ha richiamata è sincrono.

Per le chiamate asincrone si ottiene questa eccezione nel metodo onFailure(...) della richiamata.

Per le chiamate sincrone non si ottiene affatto, a meno che non si avvolga la chiamata in un try / catch.

 try { // your synchronous call goes here } catch (RetrofitError error) { // handle errors } 

Aggiornamento: la risposta di cui sopra si applica a Retrofit 1.9. Retrofit 2.0 ha cambiato molto questo. Se ti stai chiedendo come funzionano ora le cose in Retrofit 2.0, questo articolo fornisce alcuni suggerimenti http://inthecheesefactory.com/blog/retrofit-2.0/en

=> Usa i seguenti tipi di codice che ha funzionato per me …

// Crea object OkHttpClient

 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(100, TimeUnit.SECONDS) .readTimeout(100,TimeUnit.SECONDS).build(); 

// e imposta l’object OkHttpClient nel tuo Retrofit

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("yourbaseurl").client(client) .addConverterFactory(GsonConverterFactory.create(new Gson())).build();