करता है कि आप क्या चाहते हैं एक कस्टम OnSubscribe
कार्यान्वयन करें:
public static class OnSubscribeRefreshingCache<T> implements OnSubscribe<T> {
private final AtomicBoolean refresh = new AtomicBoolean(true);
private final Observable<T> source;
private volatile Observable<T> current;
public OnSubscribeRefreshingCache(Observable<T> source) {
this.source = source;
this.current = source;
}
public void reset() {
refresh.set(true);
}
@Override
public void call(Subscriber<? super T> subscriber) {
if (refresh.compareAndSet(true, false)) {
current = source.cache();
}
current.unsafeSubscribe(subscriber);
}
}
कोड के इस बिट के उपयोग को दर्शाता है और पता चलता है कि कैश रीसेट अनिवार्य रूप से किया जा रहा है:
Observable<Integer> o = Observable.just(1)
.doOnCompleted(() -> System.out.println("completed"));
OnSubscribeRefreshingCache<Integer> cacher =
new OnSubscribeRefreshingCache<Integer>(o);
Observable<Integer> o2 = Observable.create(cacher);
o2.subscribe(System.out::println);
o2.subscribe(System.out::println);
cacher.reset();
o2.subscribe(System.out::println);
आउटपुट:
completed
1
1
completed
1
वैसे आप देख सकते हैं कि .cache
पूरा होने तक उत्सर्जन नहीं करेगा। यह एक बग है जिसे आरएक्सजेवा 1.0.14 द्वारा तय किया जाना चाहिए।
आपके जीसी दबाव चिंताओं के संदर्भ में, जब एक पर्यवेक्षक पर लागू होता है तो प्रत्येक ऑपरेटर आमतौर पर lift
या create
के माध्यम से एक नया पर्यवेक्षण बनाता है। एक नया अवलोकन करने के साथ जुड़े मूल सदस्य राज्य onSubscribe
फ़ंक्शन का संदर्भ है। cache
सबसे अधिक से अलग है जिसमें यह सब्सक्रिप्शन में राज्य रखता है और इसमें जीसी दबाव के लिए संभावित क्षमता होती है यदि इसमें बहुत सारी स्थिति होती है और उसे अक्सर फेंक दिया जाता है। यहां तक कि यदि आपने रीसेट में राज्य को पकड़ने के लिए एक ही म्यूटेबल डेटा स्ट्रक्चर का उपयोग किया है, तो भी जीसी को डेटा संरचना की सामग्री को तब तक निपटाना होगा जब आपको मंजूरी मिलती है ताकि आपको ज्यादा लाभ न हो।
आरएक्सजेवा cache
ऑपरेटर एकाधिक समवर्ती सदस्यता के लिए बनाया गया है। आप शायद कल्पना कर सकते हैं कि एक रीसेट कार्यक्षमता लागू करने के लिए समस्याग्रस्त साबित हो सकती है। यदि आप आगे का पता लगाना चाहते हैं तो हर तरह से आरएक्सजेवा जीथ्यूब पर एक मुद्दा उठाएं।
स्रोत
2015-07-31 05:24:17
थोड़ा साफ –
साफ दिखता है! हालांकि, ऐसा करने से हमारे पास एक और अधिक सुरुचिपूर्ण और आरएक्स-ईश एपीआई है लेकिन मुझे लगता है कि हम सिर्फ देखने योग्य मनोरंजन को छुपा रहे हैं। अगर मैंने rxjava के स्रोत को गलत नहीं पढ़ा है, तो कैश() एक नया (कैश किया गया) देखता है: https: // github।com/ReactiveX/RxJava/blob/230bdca4b674f7d8c6ce13b47d33fe9598ad89bb/src/main/java/rx/internal/operators/cachedObservable.java # L56 – fedepaol
पर्यवेक्षण निर्माण के बारे में नोट्स के साथ अद्यतन किया गया। –