2016-03-24 5 views
9

Observable.fromCallable() ist ideal für die Umwandlung einer einzelnen Funktion in eine Observable. Aber wie gehen Sie mit geprüften Ausnahmen um, die von der Funktion ausgelöst werden?Wie kann Observable.fromCallable() mit einer aktivierten Ausnahme verwendet werden?

Die meisten Beispiele, die ich gesehen habe, verwenden Lambdas und "arbeiten einfach". Aber wie würdest du das ohne Lambdas machen? Siehe zum Beispiel das Zitat unten von this great article:

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

Es ist ein One-Liner jetzt! Es handelt sich um checked Ausnahmen, nicht mehr seltsam Observable.just() und Observable.error() für so einfache Sache wie verzögern Codeausführung!

Wenn ich versuche, die oben beobachtbare ohne Lambda-Ausdruck, den ich gesehen habe auf andere Beispiele basieren zu implementieren und wie Android Studio automatisch vervollständigt, erhalte ich folgendes:

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

Aber wenn downloadFileFromNetwork() wirft eine geprüfte Ausnahme, ich muss versuchen, es zu fangen und es in eine RuntimeException wickeln. Es muss einen besseren Weg geben! Wie unterstützt das obige Lambda das?!?!

+0

Verwenden Sie java.util.concurrent.Callable in der Dokumentation http://reactivex.io/RxJava/javadoc/rx/Observable.html#fromCallable(java.util.concurrent.Callable) – flakes

Antwort

18

Anstatt Func0 mit Observable.fromCallable() zu verwenden, verwenden Sie Callable. Zum Beispiel:

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

Seit Callable ‚s Methode call()Exception wirft, müssen Sie nicht Ihre Funktion in einem Try-Catch wickeln! Dies muss sein, was das Lambda unter der Haube verwendet.

3

Sie könnten auch dies tun, um zu prüfen Ausnahmen zurück:

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

Also hier ist ich Serialisierung des IOException Risiko einzugehen, und ich gebe eine aussagekräftigeren Beschreibung zurück.

Verwandte Themen