2016-03-24 7 views
9

Observable.fromCallable(), tek bir işlevi Gözlemlenebilir hale getirmek için harikadır. Ancak, işlevin atlatabileceği kontrol edilen istisnaları nasıl ele alırsınız?Gözlemlenebilir bir istisna ile Observable.fromCallable() nasıl kullanılır?

Gördüğüm örneklerin çoğu, lambdas ve "just work" işlevini kullandı. Ama bunu lambda olmadan nasıl yaparsın? Örneğin, this great article aşağıda alıntı bakın:

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

Bu tek liner şimdi bu! Kontrol edilen istisnalarla ilgilenir, daha fazla tuhaf Observable.just() ve Observable.error() kod yürütmeyi erteleme gibi kolay bir şey için!

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

Ama eğer:

Ben gördüğüm diğer örneklere dayanarak, bir lambda ifadesi olmadan yukarıdaki gözlemlenebilir uygulamaya çalışırsanız ve Android Studio otomatik tamamlar nasıl

, aşağıdaki alıyorum downloadFileFromNetwork() kontrol edilmiş bir istisna atar, onu yakalamaya çalışmam ve RuntimeException'a sarmam gerek. Daha iyi bir yol olmalı! Yukarıdaki lambda bunu nasıl destekliyor?!?!

+0

Kullanmak java.util.concurrent.Callable dokümanlar görüldü http://reactivex.io/RxJava/javadoc/rx/Observable.html#fromCallable(java.util.concurrent.Callable) – flakes

cevap

18

Observable.fromCallable() ile Func0 kullanmak yerine, Callable'u kullanın. Örneğin: yöntem call()Exception atar

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

'ın Callable olduğundan, bir try-catch Işlevinizin sarmak gerekmez! Bu lambda'nın başlık altında kullandığı şey olmalı.

3

Ayrıca kontrol istisnalar döndürmek için bu yapabilirdi:

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

Yani burada ben IOException risk alıyor seri ediyorum ve daha açıklayıcı bir açıklama geri veriyorum.