2015-06-15 10 views
6

पर आधारित है, यहां मामला है, मेरे पास एपीआई कॉल usign रेट्रोफिट है जो नेटवर्क त्रुटि के कारण विफल हो सकता है। अगर यह विफल रहता है तो हम एक पुनः प्रयास बटन के साथ त्रुटि संदेश दिखाएंगे। जब उपयोगकर्ता पुनः प्रयास बटन दबाता है तो हमें फिर से नवीनतम अवलोकन करने की आवश्यकता होती है।RxJava पुन: तर्क

संभव समाधान:

  1. पुन: प्रयास करें: पुन: प्रयास करें नमूदार को सदस्यता लेने से पहले इस्तेमाल किया जाना चाहिए और इसे तुरंत फिर से पुन: सदस्यता होगा त्रुटि होता है और वह यह है कि मैं नहीं है क्या चाहते हैं, तो मैं केवल यदि पुन: सदस्यता करने की जरूरत है उपयोगकर्ता ने पुनः प्रयास बटन दबाया।

  2. पुनः प्रयास करें: जब तक आप अवलोकन त्रुटि को छोड़ नहीं देते तब तक यह आइटम को उत्सर्जित करने की कोशिश करेगा, तो यह रुक जाएगा। यहां एक ही मुद्दा है, जब तक उपयोग का निर्णय नहीं लेता है, तब तक मुझे पुनः प्रयास प्रक्रिया शुरू नहीं करने की आवश्यकता होती है।

  3. उसी अवलोकन करने के लिए पुन: सदस्यता लें: यह समाधान अवलोकन वस्तुओं को उत्सर्जित करना शुरू कर देगा, इस समस्या में हम कैश ऑपरेटर का उपयोग कर रहे हैं, इसलिए यदि कोई पर्यवेक्षक विफल हो गया, तो हमें असफल आइटम कैश किया गया और जब हम सब्सक्राइब करते हैं फिर, हमें एक ही त्रुटि मिल गई।

क्या कोई अन्य समाधान है?

उत्तर

6

आप पुनः प्रयास के साथ जा सकते हैं, जब पैरामीटर - Func1 - एक अवलोकन योग्य देता है जो इंगित करता है कि एक पुनः प्रयास कब होना चाहिए। उदाहरण के लिए:

PublishSubject<Object> retryButtonClicked = PublishSubject.create(); 

Observable 
     .error(new RuntimeException()) 
     .doOnError(throwable -> System.out.println("error")) 
     .retryWhen(observable -> observable.zipWith(retryButtonClicked, (o, o2) -> o)) 
     .subscribe(); 

retryButtonClicked.onNext(new Object()); 

हर बार emmits एक घटना retryButtonClicked, प्रत्यक्ष

से प्रयास किया जाएगा यहाँ भी एक उदाहरण है - https://gist.github.com/benjchristensen/3363d420607f03307dd0

+0

नहीं पुनर्प्रयास बिल्कुल भी, मुझे लगता है कि retryWhen आप के रूप में काम नहीं करता है इसे समझाएं, पहली बार rety जब ज़िप को कॉल करता है और उपयोगकर्ता के कारण उत्सर्जित आइटम प्राप्त नहीं करता है, तब तक बटन पर क्लिक नहीं किया गया है, यह पुनः प्रयास करने और त्रुटि को निगल देगा। –

+0

पुनः प्रयास करें जब त्रुटि होती है तो उसे कॉल नहीं किया जाता है, इसे केवल एक बार देखने योग्य निर्माण समय पर बुलाया जाता है, और यह एक पर्यवेक्षक देता है जो इंगित करता है कि कब पुनः प्रयास करना है। ऊपर पोस्ट किया गया कोड दो बार "त्रुटि" प्रिंट करता है। – krp

+0

धन्यवाद, आपका समाधान काम कर रहा है, यह मेरी गलती थी जब मैंने इसे अपने कोड में लागू किया .. क्या आप कृपया मुझे बता सकते हैं कि मुझे ग्राहक का उपयोग क्यों नहीं करना चाहिए और इसके बजाय doonext, doOnError का उपयोग क्यों करना चाहिए? स्पष्टीकरण के लिए –