2015-09-18 11 views
5

मैं प्रत्यक्ष जो निष्पादित करेंगे एक प्रत्येक 30 सेकंड रेट्रोफिट साथ बाकी-कॉल निम्नलिखित: यह है कि हो सकता हैRxJava: अपवाद और पुन: प्रयास करें (देरी के साथ) बेनकाब

Subscription subscription = Observable.interval(0, REFRESH_INTERVAL, TimeUnit.SECONDS) 
     .concatMap(new Func1<Long, Observable<Response>>() { 
      @Override 
      public Observable<Response> call(Long time) { 
       return webservice.callRetrofitServiceWithRx(parameter); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new UpdateSuccessAction(), new UpdateErrorAction()); 

(विशेष रूप से बाकी-कॉल) एक अपवाद फेंक देगा (उदाहरण के लिए कोई इंटरनेट कनेक्शन)।

मैं प्राप्त करने के लिए चाहते हैं क्या:

नमूदार फेंकना चाहिए/अपवाद का पर्दाफाश, ताकि मैं यूआई पर एक त्रुटि संदेश प्रदर्शित कर सकते हैं, लेकिन यह आइटम उत्सर्जन जारी रखना चाहिए (30 सेकंड में पुन: प्रयास) ।

वर्तमान में अनुसंधान

  • मैं किसी विशेष व्यवहार प्रत्यक्ष अपवाद का उत्सर्जन करता है और बंद हो जाता है काम कर परिभाषित नहीं है (= 30 सेकंड में पुन: प्रयास करें सं)।

  • यदि मैं पुनः प्रयास ऑपरेटर का प्रयास करता हूं, तो अपवाद निगल जाएगा और खुलासा नहीं होगा, इसलिए मैं UI में कोई त्रुटि प्रदर्शित नहीं कर सकता।

  • यदि मैं ऑनररेटर ऑपरेटर को आजमाता हूं, तो मैं अपवाद को संभाल सकता हूं, लेकिन जहां तक ​​मुझे पता है, कोई पुनः प्रयास संभव नहीं है।

वर्कअराउंड

मेरे वर्तमान वैकल्पिक हल इस नमूदार में पुन: सब्सक्राइब करने के लिए है, लेकिन मैं अगर किसी को एक और अधिक सुरुचिपूर्ण समाधान है पता करना चाहते हैं।

उत्तर

4

मैं doOnError संभालने कर रहा हूँ (त्रुटि लॉग इन करने के लिए) अपनी जरूरत फिट होगा, फिर से प्रयास करें के साथ संयुक्त, उदाहरण के लिए:

Subscription subscription = Observable.interval(0, REFRESH_INTERVAL, TimeUnit.SECONDS) 
    .concatMap(new Func1<Long, Observable<Response>>() { 
     @Override 
     public Observable<Response> call(Long time) { 
      return webservice.callRetrofitServiceWithRx(parameter); 
     } 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .doOnError(new UpdateErrorAction()) 
    .retry() 
    .subscribe(new UpdateSuccessAction()); 
+0

कूल, बहुत बहुत शुक्रिया! – Christopher

1

अन्य जवाब की मदद से यदि एक समाधान मिल गया।

पहले मैंने एक रेट्रीविथडेले-फ़ंक्शन को परिभाषित किया जो 30 सेकंड के बाद पुनः प्रयास शुरू करता है और तुरंत नहीं।

private static class RetryWithDelay 
    implements Func1<Observable<? extends Throwable>, Observable<?>> { 

    @Override 
    public Observable<?> call(Observable<? extends Throwable> attempts) { 
    return attempts.flatMap(new Func1<Throwable, Observable<?>>() { 
     @Override 
     public Observable<?> call(Throwable throwable) { 
      return Observable.timer(CallBO.REFRESH_INTERVAL_IN_SEC,    } 
    }); 
    } 
} 

कौन सा मैं तो इस प्रत्यक्ष-चेन में इस्तेमाल किया:

Subscription subscription = Observable.interval(0, REFRESH_INTERVAL, TimeUnit.SECONDS) 
.concatMap(new Func1<Long, Observable<Response>>() { 
    @Override 
    public Observable<Response> call(Long time) { 
     return webservice.callRetrofitServiceWithRx(parameter); 
    } 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.doOnError(new UpdateErrorAction()) 
.retryWhen(new RetryWithDelay()) 
.subscribe(new UpdateSuccessAction()); 
संबंधित मुद्दे