भीतर से फोन कर सदस्यता समाप्त मुझे आश्चर्य है कि क्या यह उस तरह onNext
हैंडलर के भीतर से unsubscribe
कॉल करने के लिए कानूनी है:RxJava: onNext
List<Integer> gatheredItems = new ArrayList<>();
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
public void onNext(Integer item) {
gatheredItems.add(item);
if (item == 3) {
unsubscribe();
}
}
public void onCompleted() {
// noop
}
public void onError(Throwable sourceError) {
// noop
}
};
Observable<Integer> source = Observable.range(0,100);
source.subscribe(subscriber);
sleep(1000);
System.out.println(gatheredItems);
ऊपर कोड सही तरीके से आउटपुट कि सिर्फ चार तत्वों को इकट्ठा किया गया: [0, 1, 2, 3]
। लेकिन किसी स्रोत नमूदार कैश हो जाने को परिवर्तित करता है:
Observable<Integer> source = Observable.range(0,100).cache();
तब सभी सौ तत्वों इकट्ठे हुए हैं। मेरे पास स्रोत पर नियंत्रण नहीं है (चाहे वह कैश किया गया हो या नहीं), तो onNext
के भीतर से निश्चित रूप से सदस्यता कैसे लें?
बीटीडब्ल्यू: तो onNext
गलत काम करने के भीतर सदस्यता रद्द कर रहा है?
(मेरे वास्तविक उपयोग के मामले कि onNext
में मैं वास्तव में उत्पादन धारा लिए लिख रहा हूँ है, और एक IOException
तब होता है जब ज्यादा कुछ नहीं उत्पादन के लिए लिखा जा सकता है तो मैं किसी भी तरह आगे की प्रक्रिया को रोकने के लिए की जरूरत है।)
यह कोड अपेक्षित काम नहीं करता है, यह सौ बार "जेनरेटिंग" प्रिंट करता है जिसके बाद सौ गुना "सेविंग" होता है। मैं केवल चार बार "सेविंग" की उम्मीद करता हूं। –
मैंने इसे पोस्ट करने से पहले अपना उदाहरण चलाया है, इसलिए यह प्रत्येक 3 लाइनों को प्रिंट करता है। क्या आपने इसे क्रियान्वित करने की कोशिश की है या आपने इसे अपने प्रवाह में डालने का प्रयास किया है? – akarnokd
मैंने आपके उदाहरण वर्बैटिम का उपयोग किया, बस मुख्य और आयात जोड़ा। मैंने इसे दो अलग-अलग कंप्यूटरों पर जावरक्स 1.0.12 पर चलाया था, और यह हमेशा "बचत" को सौ बार प्रिंट करता है। –