/ / RXJava2 सदस्यता प्रबंधित करें - जावा, आरएक्स-जावा 2, publsubject

RXJava2 सदस्यता प्रबंधित करें - जावा, आरएक्स-जावा 2, publsubject

मुझे यह स्पष्ट करने की आवश्यकता है कि RxJava2 का उपयोग करके विशिष्ट परिदृश्य को प्रबंधित करने के लिए सबसे अच्छा तरीका क्या है (संपूर्ण ऐप संरचना उस पर आधारित है):

मेरे ऐप में, बहुत से लोग इसमें बदलाव कर सकते हैंएक ही दस्तावेज़, इसलिए मुझे दस्तावेज़ में देख रहे सभी को हर बदलाव देने की ज़रूरत है। लेकिन यह वस्तु बहुत जटिल और भारी है, इसलिए आखिरी व्यक्ति इसे बंद करते समय मुझे इसे स्मृति से हटाने की जरूरत है। और अधिक: दस्तावेज़ किसी अन्य दस्तावेज़ से बच्चा हो सकता है, इसलिए मूल दस्तावेज़ में प्रत्येक परिवर्तन सभी बच्चों को भेजा जाना चाहिए।

मैंने अब तक क्या किया है: मैंने एक प्रबंधक बनाया ताकि प्रत्येक दस्तावेज़ अनुरोध इसके लिए आता है। जब भी किसी को दस्तावेज़ पर काम करने की ज़रूरत होती है, तो दस्तावेज़ पहले से खुला होने पर मैप में देखता है। यदि ऐसा नहीं है, तो मैं बेसडॉकमेंट उदाहरण बनाता हूं, जो दस्तावेज़ों से डेटा प्राप्त करता है और घटनाओं को वितरित करने और उस मानचित्र में जोड़ने के लिए PublishSubject प्राप्त करता है। फिर मैं परिवर्तन प्राप्त करने के लिए PublishSubject पर उपयोगकर्ता के पर्यवेक्षक की सदस्यता लेता हूं। जब भी उपयोगकर्ता को कुछ बदलने की ज़रूरत होती है, तो यह बेसडॉक्यूमेंट में परिवर्तन भेजता है, यह परिवर्तन करता है और नए संस्करण को अगला () को सभी के माध्यम से भेजता है। अब तक सब ठीक है।

मेरी समस्या यह है कि मैं किसी पर नियंत्रण नहीं कर सकतादस्तावेज़ पर्यवेक्षक को निपटाता है, इसलिए जब मैं दस्तावेज़ की आवश्यकता नहीं है तो मैं नियंत्रण नहीं कर सकता, इसलिए मैं किसी भी सहेजे गए परिवर्तनों को जारी रख सकता हूं और ऑब्जेक्ट को नष्ट कर सकता हूं। मुझे "हैसबर्सवर्स ()" को छोड़कर कोई भी सदस्यता सूची या कुछ भी नहीं मिल सकता है और अगर यह सब किया जाता है तो मैं इसे बंद करने के लिए मतदान करने के लिए टाइमर जोड़ना नहीं चाहता हूं।

मेरा "चमत्कारी जवाब" एक कॉलबैक होगाजिसे अंतिम ग्राहक निपटाया जाता है, इसलिए मैं घर को साफ कर सकता हूं और पूरी वस्तु को फेंक सकता हूं, लेकिन मुझे ऐसा कुछ नहीं मिल सकता है। तो, मैं सदस्यता कैसे प्रबंधित कर सकता हूं?

उत्तर:

जवाब के लिए 0 № 1

दृष्टिकोणों में से एक सदस्यता और निपटान की संख्या गिनना होगा। और यदि संख्या 0 हिट करती है, तो दस्तावेज़ को हटा दें। यह ऐसा कुछ दिखाई देगा:

int numberOfSubscribers = 0;

...

public Observable<T> expose(){
return subject.asObservable()
.doOnSubscribe(()-> numberOfSubscribers++)
.doOnDispose(()-> {
numberOfSubscribers--;
if (numberOfSubscribers == 0){
//remove the object
}
});

बेशक आपको यहां समेकन समस्या (सिंक्रनाइज़ / परमाणु int) के लिए समर्थन जोड़ने की आवश्यकता है, यह सिर्फ एक मसौदा है।

उम्मीद है की यह मदद करेगा :)