2013-02-12 36 views
8

मैं मैसेंजर प्लगइन को कार्यक्षमता के साथ विस्तारित कर रहा हूं, जिससे पृष्ठभूमि धागे पर होने वाली हर चीज़ के बजाय मुख्य धागे पर संदेश पास करना संभव हो जाएगा।एमवीवीएमक्रॉस: प्लगइन में InvokeOnMainThread का उपयोग

मैंने BaseSubscription को bool के साथ विस्तारित किया है यह जानने के लिए कि इस सदस्यता को मुख्य धागे पर संदेश भेजने की आवश्यकता है। अब मुझे सब्सक्रिप्शन के वास्तविक कार्यान्वयन में TypedInvoke विधियों से InvokeOnMainThread का उपयोग करने में सक्षम होना चाहिए।

जब मैं संदर्भित एमवीवीएमक्रॉस असेंबली में देखता हूं तो मुझे लगता है कि Cirrious.MvvmCross.ViewModels.MvxMainThreadDispatchingObject में InvokeOnMainThread विधि है, इसलिए प्रश्न यह है कि मैं उस ऑब्जेक्ट को कैसे पकड़ूं ताकि मैं विधि का आह्वान कर सकूं?

उत्तर

5

यूआई धागे की पकड़ पाने के लिए सबसे आसान तरीका से MvxMainThreadDispatchingObject

वारिस के पदानुक्रम आप नहीं दूँगी तो है, तो अगला सबसे आसान तरीका है IMvxServiceConsumer मार्कर इंटरफेस को जोड़ने के लिए और फिर GetService<T> उपयोग करने के लिए है विस्तार विधि:

public class MyClass 
    : MyBaseClass 
    , IMvxServiceConsumer 
{ 
    // ... 

    private bool DoStuff(Action stuff) 
    { 
     var dispatcherProvider = this.GetService<IMvxMainThreadDispatcherProvider>(); 
     var dispatcher = dispatcherProvider.Dispatcher; 
     if (dispatcher == null) { 
      return false; 
     } 

     return dispatcher.RequestMainThreadAction(action); 
    } 
} 

GetService<T>() स्थिर विधि भी अगर वरीय एक स्थिर पद्धति के रूप में लागू किया जा सकता है (आप IMvxServiceConsumer का उपयोग नहीं करना चाहते हैं)।


नोट्स:

  • आप के बीच 'एप्लिकेशन' और 'सेवा'/'BackgroundAgents' आप त्रुटि स्थितियों के लिए जाँच करने के लिए बहुत सावधान रहना चाहिए कोड साझा कर रहे हैं, तो - वहाँ हमेशा नहीं है एक यूआई धागा उपलब्ध है।

  • एंड्रॉयड विशेष रूप से विशेष है - यूआई धागा केवल वास्तव में वर्तमान अग्रभूमि गतिविधि के माध्यम से पहुँचा जा सकता है - वर्तमान में MvvmCross पटरियों इस IMvxAndroidCurrentTopActivity सेवा में (गतिविधि onStart और OnResume हुक के माध्यम से) - लेकिन कोई गारंटी नहीं कि आप हमेशा होगा कि वहाँ एक अग्रभूमि गतिविधि चल रही है - उदाहरण के लिए यदि आपका कोड कभी भी गैर-एमवीवीएमक्रॉस गतिविधियों को लोड करता है तो स्पष्ट रूप से एमवीवीएमक्रॉस इनके बारे में नहीं जान पाएगा।

  • आप डिस्पैचर के लिए संदर्भ पर पकड़ नहीं करना चाहिए - अगर आप ऐसा करेंगे, तो आप पकड़े हो सकता है एंड्रॉयड गतिविधि के अपने प्राकृतिक जीवन काल

  • मुझे लगता है कि DoStuff परे स्मृति में एक विस्तार विधि में भी रखा जा सकता है - शायद मैं इसे v3 (https://github.com/slodge/MvvmCross/issues/150) में जोड़ दूंगा

+0

क्या यह अभी भी अद्यतित है? – tofutim

+1

MvxMainThreadDispatchingObject से विरासत मेरे लिए एक इलाज किया (मेरे एमवीवीक्रॉस प्लगइन में से एक के आईओएस में)। –

+0

क्या आप DoStuff फ़ंक्शन को कॉल करने के तरीके पर एक उदाहरण प्रदान कर सकते हैं? उदाहरण के लिए, एक लोडिंग अनुक्रम प्रदर्शित करने के लिए। धन्यवाद। – Ph0b0x

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

  • कोई संबंधित समस्या नहीं^_^