2016-03-24 8 views
9

Observable.fromCallable() एक समारोह को एक अवलोकन में परिवर्तित करने के लिए बहुत अच्छा है। लेकिन आप चेक अपवादों को कैसे संभालते हैं जिन्हें फ़ंक्शन द्वारा फेंक दिया जा सकता है?एक चेक अपवाद के साथ Observable.fromCallable() का उपयोग कैसे करें?

मैंने देखा है कि उदाहरणों में से अधिकांश उदाहरण लैम्बडास और "बस काम" करते हैं। लेकिन आप lambdas के बिना यह कैसे करेंगे? उदाहरण के लिए, this great article से नीचे बोली देखें:

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

अब यह एक एक लाइनर है! यह चेक अपवादों को परिभाषित करने के रूप में चेक अपवादों से संबंधित है, और अधिक अजीब Observable.just() और Observable.error() ऐसी आसान चीज़ के लिए!

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

लेकिन अगर:

जब मैं एक लैम्ब्डा अभिव्यक्ति के बिना ऊपर प्रत्यक्ष, अन्य उदाहरण के आधार पर मैंने देखा है लागू करने के लिए प्रयास करते हैं, और कैसे एंड्रॉयड स्टूडियो ऑटो पूरा करता है, मैं निम्नलिखित मिल downloadFileFromNetwork() एक चेक अपवाद फेंकता है, मुझे इसे पकड़ने और इसे RuntimeException में लपेटना होगा। एक बेहतर तरीका होना चाहिए! उपरोक्त लैम्ब्डा इसका समर्थन कैसे करता है?!?

+0

java.util.concurrent का उपयोग करें। दस्तावेज़ों में देखा जा सकता है http://reactivex.io/RxJava/javadoc/rx/Observable.html#fromCallable(java.util.concurrent.Callable) – flakes

उत्तर

18

Observable.fromCallable() के साथ Callable का उपयोग करने के बजाय। उदाहरण के लिए:

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

Callable के बाद से की विधि call() फेंकता Exception, तो आप एक कोशिश पकड़ में अपने कार्य रैप करने के लिए नहीं है! यह होना चाहिए कि लैम्ब्डा हुड के नीचे क्या उपयोग कर रहा है। तो यहाँ मैं IOException जोखिम ले serializing कर रहा हूँ, और मैं वापस दे रहा हूँ एक और वर्णनात्मक विवरण

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

:

3

इस जांचे हुए अपवादों वापस जाने के लिए कर सकता है।

संबंधित मुद्दे