2013-10-29 12 views
5

मैं अपने एमवीवीएमक्रॉस एप्लिकेशन में मैसेंजर प्लगइन का उपयोग कर रहा हूं और देखा है कि यह कभी-कभी मेरी सब्सक्रिप्शन को शुद्ध करता है ("एक या अधिक श्रोताओं विफल - शुद्ध निर्धारित")। यह मेरे आवेदन में एक त्रुटि पैदा कर रहा है। डिफ़ॉल्ट रूप से मैं सदस्यता के लिए कमजोर संदर्भ का उपयोग कर रहा हूं और मैं संदेश से सदस्यता समाप्त नहीं कर रहा हूं।एमवीवीएमक्रॉस मैसेंजर प्लगइन पर्जिंग सब्सक्रिप्शन

क्या मुझे सदस्यता छोड़ने की आवश्यकता है? कमजोर संदर्भ का मुद्दा यह कचरा इकट्ठा करने की अनुमति नहीं है?

मेरा बेसव्यू कन्स्ट्रक्टर में सदस्यता ले रहा है जैसा कि नीचे दिखाया गया है।

public BaseView() 
    { 
     _messenger = Mvx.Resolve<IMvxMessenger>(); 
     _messenger.Subscribe<MyMessage>(s => Method()); 
    } 

नीचे मेरा प्रसारण रिसीवर मेरा संदेश प्रकाशित कर रहा है।

var _messenger = Mvx.Resolve<IMvxMessenger>(); 
_messenger.Publish<MyMessage>(new MyMessage(this)); 

मुझे ऑनस्ट्रॉय में सदस्यता समाप्त करने का प्रयास करने का विचार है।

यदि आप मुझे कुछ अंतर्दृष्टि दे सकते हैं कि यह क्यों हो रहा है और एक संभावित समाधान मैं आभारी हूं।

अग्रिम धन्यवाद।

+0

इस सवाल के बजाय कुछ कोड से लाभ होगा "मेरा बेसव्यू कन्स्ट्रक्टर में सदस्यता ले रहा है और ऑनस्ट्रॉय में सदस्यता समाप्त करने का प्रयास करने का विचार है।" – Stuart

+0

मैंने कुछ कोड जोड़ा है, अगर आपको और जानकारी चाहिए तो मुझे बताएं। – Jake

उत्तर

13

कमजोर संदर्भों का उपयोग करते समय, क्लास-स्तरीय फ़ील्ड में लौटाई गई सदस्यता टोकन को स्टोर करना महत्वपूर्ण है।

private IDisposable _token; 

public BaseView() 
{ 
    _messenger = Mvx.Resolve<IMvxMessenger>(); 
    _token = _messenger.Subscribe<MyMessage>(OnMyMessage); 
} 

private void OnMyMessage(MyMessage msg) 
{ 
    // code 
} 

यदि आप ऐसा नहीं करते हैं, तो GarbageCollector सदस्यता एकत्र करने के लिए स्वतंत्र है।

इस बारे में अधिक के लिए, कृपया पर अनुभाग देखें "यह जीसी आधारित सदस्यता खत्म हो जाएगा जब भी सदस्यता टोकन सदस्यता से लौटे कचरा एकत्र है" विकि में - https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#messenger

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