2016-10-03 3 views
6

मैं और rxJava/एंड्रॉयड के लिए नए और आश्चर्य है कि मेरे onError लैम्ब्डा कभी कभी मुख्य-धागे पर कहा जाता है कभी कभी नहीं हूँ, हालांकि मैं का उपयोग मुख्य थ्रेड में RxAndroid त्रुटियों को संभालने के लिए .observeOn(AndroidSchedulers.mainThread())कैसे

उदाहरण 1 : मुख्य धागा
पर onError इस अपेक्षा के अनुरूप काम करता है: onError मुख्य-धागे पर कहा जाता है

Observable.error(new RuntimeException("RTE")) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(s -> { 
       Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName()); 
      }, 
      throwable -> { 
       Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName()); 
      }); 

लॉग-उत्पादन:

onError()-thread: main 

उदाहरण 2: onErrorनहीं मुख्य-धागे पर

Observable.create(new Observable.OnSubscribe<String>() { 
    @Override 
    public void call(Subscriber<? super String> subscriber) { 
     subscriber.onNext("one and only"); 
    } 
}) 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.timeout(1, TimeUnit.SECONDS) 
.subscribe(s -> { 
     Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName()); 
    }, 
    throwable -> { 
     Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName()); 
    }); 

उत्पादन कुछ इस तरह है:

onNext(one and only)-thread: main 
onError()-thread: RxComputationScheduler-4  

मैंने सोचा था कि observeOn(AndroidSchedulers.mainThread()) बुला के बाद, सभी उत्सर्जन होना चाहिए मुख्य धागे पर किया।

  1. मैं किसी भी प्रलेखन कि किन परिस्थितियों onError जो सूत्र में कहा जाता है के तहत निर्दिष्ट करता नहीं पा सके:

    तो मैं इन सवालों की है। कोई भी एक लिंक जानता है?

  2. मैं निश्चित रूप से कर जीयूआई में कुछ त्रुटि-संकेत प्रदर्शित करना चाहते हैं: तो कैसे मैं हमेशा मुख्य-सूत्र में कहा जा onError मजबूर कर सकते हैं?

उत्तर

5

मैं सिर्फ पता चला कि मैं केवल कॉल का क्रम बदलने की जरूरत है। जब मैं timeout के बाद observeOn फोन यह उम्मीद के रूप में काम करता है:

.timeout(1, TimeUnit.SECONDS) 
.observeOn(AndroidSchedulers.mainThread()) 

लॉग-उत्पादन

onNext(one and only)-thread: main 
onError()-thread: main 

कारण है कि observeOn केवल कॉल नीचे सब कुछ प्रभावित करेगा, और केवल जब तक कुछ अन्य ऑपरेटर बदल जाता है फिर से धागा उपर्युक्त उदाहरण में, timeout() गणना गणना में बदल जाएगा।

ध्यान दें, कि subscribeOn अलग तरह से काम करता है। इससे कोई फर्क नहीं पड़ता कि आप जिस श्रृंखला में इसे कॉल करते हैं।
आप केवल एक बार फोन करना चाहिए (कई जब आप इसे फोन बार पहली कॉल जीत: इस Blog में "एक से अधिक subscribeOn" देखें): RxJava- Understanding observeOn() and subscribeOn()

2

क्योंकि .timeout(1, TimeUnit.SECONDS) डिफ़ॉल्ट रूप से Schedulers.computation() पर चलता है।

+0

यहाँ और अधिक विवरण के साथ एक अच्छा ब्लॉग पोस्ट है लेकिन [observOn()] (http://reactivex.io/documentation/operators/observeon.html) को उस डिफ़ॉल्ट को ओवरराइड करना चाहिए, है ना? – TmTron