2016-11-15 4 views
5

मान लें कि मेरे पास एक प्रोसेसर है जो एक बटन दबाए जाने पर एक बूलियन मान उत्सर्जित करता है, इसे टॉगल के रूप में सोचें।RxJava 2.X में एक बूलियन गेट के आधार पर एक अवलोकन योग्य को फिर से शुरू करें और फिर से शुरू करें?

boolean gateValue = true; 
    PublishProcessor<Boolean> gate = PublishProcessor.create(); 
    view.onButtonClicked() 
      .subscribe(new Action1<Void>() { 
       @Override 
       public void call(final Void aVoid) { 
        gate.onNext(gateValue = !gateValue); 
       } 
      })); 

मैं करना चाहते हैं क्या रोक सकते हैं और एक नमूदार अनुक्रम फिर से शुरू करने, उत्सर्जित मूल्यों बफरिंग जबकि रुका हुआ फाटक के मूल्य का उपयोग है।

मैंने इसमें बहुत कुछ पढ़ा है और जबकि यह अन्य भाषाओं के लिए प्रतिक्रियाशील एक्सटेंशन में संभव लगता है, तो आरएक्सजेवा इसका समर्थन नहीं कर रहा है।

यहां एक उदाहरण है जो मैं प्राप्त करना चाहता हूं, यह हर सेकेंड में वृद्धिशील मूल्य को आउटपुट करता है। जब मैं बटन दबाएँ जब तक मैं इसे फिर से प्रेस उत्पादन बंद करना चाहते हैं जो चाहिए उत्पादन हर आइटम दो बटन प्रेस के बीच उत्सर्जित:

Flowable.interval(1, TimeUnit.SECONDS) 
       .bufferWhile(gate) 
       .flatMapIterable(longs -> longs) 
       .subscribe(new Consumer<Long>() { 
        @Override 
        public void accept(final Long aLong) throws Exception { 
         view.displayTime(aLong); 
        } 
       }); 

किसी को भी एक तरह से कुछ इस तरह प्राप्त करने के लिए पता है?

संपादित मैं कैसे प्राप्त करने के लिए इस https://medium.com/@scottalancooper/pausing-and-resuming-a-stream-in-rxjava-988a0977b771#.gj7fsi1xk

+0

इसके लिए एक कस्टम ऑपरेटर की आवश्यकता है और मेरे पास आरएक्सजेवा 1 [यहां] (https://gist.github.com/akarnokd/1c54e5a4f64f9b1e46bdcf62b4222f08) के लिए एक संभावित कार्यान्वयन है। – akarnokd

+0

@akarnokd क्या आप RxJava 2 के बारे में पर्याप्त जानते हैं यह जानने के लिए कि क्या मैं इसे आसानी से परिवर्तित कर सकता हूं? मैंने पढ़ा है कि कस्टम ऑपरेटरों को बनाना मुश्किल है इसलिए मुझे नहीं लगता कि मैं उस स्तर पर अभी तक –

उत्तर

4

अब RxJava2 एक्सटेंशन लाइब्रेरी में एक ऑपरेटर valve() है जो अनुरोधित व्यवहार करता है।

+0

यह आश्चर्यजनक है कि आप इसे एंड्रॉइड के जीवन चक्र के साथ हुक करते समय क्या कर सकते हैं। – ikarhun

0

बस रेडीमेड Observable.window ऑपरेटर है कि एक Observable<T> पैरामीटर लेता है का उपयोग पर एक ब्लॉग पोस्ट में लिखा है।

+0

नहीं चाहता हूं कि गेट अवलोकन योग्य होने पर केवल स्रोत से निकल जाए? मैं स्रोत को तब तक उत्सर्जित करना चाहता हूं जब तक कि गेट झूठी न हो। –

+0

आह, वास्तव में - आप 'सत्य'/'झूठ उत्सर्जित होने पर खोलने और बंद करने के लिए 2-पैरामीटर का उपयोग कर सकते हैं। –

+0

यह काम करता है अगर मैं इसे खोलने के लिए कहता हूं जब कोई वास्तविक मूल्य होता है और झूठ होने पर बंद होता है लेकिन खिड़की बंद होने पर उत्सर्जित वस्तुओं को बफर नहीं करता है, तो यह उन्हें छोड़ देता है। मुझे यह भी एहसास हुआ है कि दोनों बफर और खिड़की केवल स्ट्रीम के बजाय बैच में आइटम छोड़ती हैं ताकि न तो ऑपरेटरों काम पर जा रहे हों। –

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