2015-05-18 15 views
19

Sto cercando di capire il modo corretto di gestire gli errori nelle chiamate sincrone di Retrofit. So per le chiamate asincrone, Retrofit ha una callback per il caso di errore. Ma come devo gestire l'errore per la chiamata sincrona? La mia ipotesi è di avvolgere la chiamata con un blocco try e gestire l'eccezione RetrofitError nel blocco catch.Gestione degli errori nella chiamata sincrona da Retrofit

+1

Perché vuoi utilizzare chiamata sincrona in retrofit? Le richieste HTTP devono essere inviate in modo asincrono in Android. –

+17

@ piotr.wittchen a volte sei già in una discussione, quindi è perfettamente logico usare una chiamata sincrona –

+0

Aggiungendo solo a ciò, penso che sia necessaria anche quando stai provando ad aggiornare un token in background dopo aver ricevuto 401 da il sever. –

risposta

6

vostra congettura sembra corretto, utilizzando le chiamate sincrone Retrofit è fatto per gettare un RetrofitError che rappresenta l'errore: Reference. Si noti che il throw IllegalStateException in handleError non dovrebbe accadere nel caso di una chiamata sincrona.

Edit: Sembra Retrofit si sta lentamente spostando verso la versione 2.0, se si pensa di utilizzare Retrofit 2.0, vi consiglio di leggere la documentazione per vedere come è fatto nella nuova versione.

Modifica pt2: La modifica è passata alla versione 2.0 e ora se si desidera gestire gli errori non è più necessario rilevare RetrofitErrors ma IOException. Si può avere direttamente uno sguardo alla realizzazione di Execute()

/** 
* Synchronously send the request and return its response. 
* 
* @throws IOException if a problem occurred talking to the server. 
* @throws RuntimeException (and subclasses) if an unexpected error occurs creating the request 
* or decoding the response. 
*/ 
Response<T> execute() throws IOException; 

Altri riferimenti: 1

4

È difficile trovarlo. Nessuno parla davvero della gestione degli errori nelle chiamate sincrone. Ma ho trovato qualcosa. Io non sono del tutto sicuro se la riga successiva dovrebbe essere aggiunto (dovrebbe sicuramente essere aggiunto per errori personalizzati, ma non è questo il caso) ho trovato here

Foo doFoo() throws RetroFitError; 

La chiamata sincrona dovrebbe accadere all'interno di una prova clausola catch in questo modo:

try{ 
    doFoo(); 
}catch(RetroFitError e){ 

} 

Trovato here

+0

Ciao Kevin, grazie per la tua risposta. In base alla fonte https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/RestAdapter.java#L182 e https://github.com/square/retrofit/blob/ master/retrofit/src/main/java/retrofit/ErrorHandler.java esiste già un gestore predefinito che genera RetrofitError. Quindi, se non abbiamo bisogno di gestire l'errore personalizzato, non è necessario generare il RetrofitError in modo specifico. –

+0

@feiqu Ohh okay. Quindi puoi lasciarlo. Il metodo try catch sarà quindi il gestore degli errori;) –