2016-03-24 14 views
9

Observable.fromCallable() è ideale per convertire una singola funzione in Osservabile. Ma come gestisci le eccezioni controllate che potrebbero essere generate dalla funzione?Come utilizzare Observable.fromCallable() con un'eccezione controllata?

La maggior parte degli esempi che ho visto utilizzano lambda e "funziona solo". Ma come lo faresti senza lambda? Ad esempio, vedere la citazione sotto da this great article:

Observable.fromCallable(() -> downloadFileFromNetwork()); 

Si tratta di un one-liner ora! Si occupa di eccezioni controllate, non più bizzarre Observable.just() e Observable.error() per cose così semplici come il rinvio dell'esecuzione del codice!

Quando si tenta di implementare osservabile sopra senza un'espressione lambda, sulla base di altri esempi che ho visto, e come Android Studio auto-completa, ottengo il seguente:

Observable.fromCallable(new Func0<File>() { 
    @Override 
    public File call() { 
     return downloadFileFromNetwork(); 
    } 
} 

Ma se downloadFileFromNetwork() getta un'eccezione controllata, devo provare a prenderlo e avvolgerlo in un RuntimeException. Deve esserci un modo migliore! In che modo la suddetta lambda supporta questo?!?!

+0

Utilizzare java.util.concurrent.Callable visto nei documenti http://reactivex.io/RxJava/javadoc/rx/Observable.html#fromCallable(java.util.concurrent.Callable) – flakes

risposta

18

Invece di utilizzare Func0 con Observable.fromCallable(), utilizzare Callable. Per esempio:

Observable.fromCallable(new Callable<File>() { 
    @Override 
    public File call() throws Exception { 
     return downloadFileFromNetwork(); 
    } 
} 

Dal Callable 's metodo call() getta Exception, non c'è bisogno di avvolgere la funzione in un try-catch! Questo deve essere ciò che la lambda usa sotto il cofano.

3

Si potrebbe anche fare questo per tornare eccezioni controllate:

return Observable.fromCallable(() -> { 
    sharedPreferences.edit() 
      .putString(DB_COMPANY, LoganSquare.serialize(
        CompanyDBTransformation.get(user.getCompany()) 
     )) 
      .apply(); 
    return user; 
    }).onErrorResumeNext(
      throwable -> Observable.error(new CompanySerializationException(throwable)) 
    ); 

Così qui sto serializzazione di correre il rischio IOException, e sto restituendo una descrizione più descrittivo.

Problemi correlati