2017-05-22 6 views
7

मैं चाहता हूं कि कोई मुझे बताए कि डिवाइस क्या है। BginginInvokeOnMainThread? और यह किसके लिए है? इस्तेमाल किए गए मामलों के उदाहरण।डिवाइस क्या है। BginginInvokeOnMainThread के लिए?

धन्यवाद।

+0

https://developer.xamarin.com/api/member/Xamarin.Forms.Device.BeginInvokeOnMainThread/p/System.Action/ – Hackerman

उत्तर

3

बस एक उदाहरण जोड़ने के लिए।

कल्पना कीजिए कि आप एक async विधि DoAnyWorkAsync अगर आप इसे इस तरह से (सिर्फ एक उदाहरण के रूप में):

DoAnyWorkAsync().ContinueWith ((arg) => { 
       StatusLabel.Text = "Async operation completed..."; 
      }); 

StatusLabel एक लेबल आप XAML में है।

उपरोक्त कोड एसिंक ऑपरेशन समाप्त होने के बाद लेबल में संदेश नहीं दिखाएगा, क्योंकि कॉलबैक यूआई थ्रेड से अलग किसी अन्य धागे में है और इसके कारण यह यूआई को संशोधित नहीं कर सकता है।

एक ही कोड आप इसे थोड़ा अपडेट करते हैं तो सिर्फ इस तरह Device.BeginInvokeOnMainThread भीतर StatusLabel पाठ अद्यतन enclosing:

DoAnyWorkAsync().ContinueWith ((arg) => { 
    Device.BeginInvokeOnMainThread (() => { 
       StatusLabel.Text = "Async operation completed..."; 
      }); 
    }); 

कोई समस्या नहीं होगी।

को Task.Delay(2000) के साथ बदलकर इसे स्वयं आज़माएं।

+0

आपको बहुत बहुत धन्यवाद –

3

आप केवल मुख्य यूआई थ्रेड से यूआई अपडेट कर सकते हैं। यदि आप पृष्ठभूमि थ्रेड पर कोड चला रहे हैं और यूआई को अपडेट करने की आवश्यकता है, तो BeginInvokeOnMainThread() आपको अपने थ्रेड को मुख्य थ्रेड पर चलाने के लिए मजबूर करने की अनुमति देता है, ताकि आप यूआई अपडेट कर सकें।

1

सरल उत्तर यह है: पृष्ठभूमि धागा यूआई तत्वों को संशोधित नहीं कर सकता क्योंकि आईओएस और एंड्रॉइड में अधिकांश यूआई ऑपरेशंस थ्रेड-सुरक्षित नहीं हैं; इसलिए, आपको उस यूआई को संशोधित करने के लिए UI थ्रेड को आमंत्रित करने की आवश्यकता है जो UI को MyLabel.Text = "नया टेक्स्ट" संशोधित करता है।

विस्तृत जवाब Xamarin दस्तावेज़ में पाया जा सकता है:

आईओएस के लिए:

IOSPlatformServices.BeginInvokeOnMainThread() विधि बस कॉल NSRunLoop.Main.BeginInvokeOnMainThread

public void BeginInvokeOnMainThread(Action action) 
{ 
    NSRunLoop.Main.BeginInvokeOnMainThread(action.Invoke); 
} 

https://developer.xamarin.com/api/member/Foundation.NSObject.BeginInvokeOnMainThread/p/ObjCRuntime.Selector/Foundation.NSObject/

यूआई थ्रेड में निर्दिष्ट चयनकर्ता के साथ उजागर किए गए निर्दिष्ट ऑब्जेक्ट में कोड का आह्वान करने के लिए आप इस विधि का उपयोग थ्रेड से करते हैं। यह उन अधिकांश परिचालनों के लिए आवश्यक है जो UIKit या AppKit को प्रभावित करते हैं क्योंकि इनमें से कोई भी एपीआई थ्रेड सुरक्षित नहीं है।

कोड तब निष्पादित किया जाता है जब मुख्य धागा घटनाओं को संसाधित करने के लिए अपने मुख्य पाश पर वापस जाता है।

Android के लिए:

कई लोग Xamarin.Android BeginInvokeOnMainThread() विधि उपयोग Activity.runOnUiThread() पर लगता है, लेकिन ऐसा नहीं है, और वहाँ runOnUiThread() और हैंडलर का उपयोग कर के बीच एक अंतर है ।पोस्ट():

public final void runOnUiThread(Runnable action) { 
    if (Thread.currentThread() != mUiThread) { 
     mHandler.post(action);//<-- post message delays action until UI thread is scheduled to handle messages 
    } else { 
     action.run();//<--action is executed immediately if current running thread is UI thread. 
    } 
} 

विधि AndroidPlatformServices.cs वर्ग में पाया जा सकता Xamarin.Android BeginInvokeOnMainThread() के वास्तविक क्रियान्वयन

public void BeginInvokeOnMainThread(Action action) 
{ 
    if (s_handler == null || s_handler.Looper != Looper.MainLooper) 
    { 
     s_handler = new Handler(Looper.MainLooper); 
    } 

    s_handler.Post(action); 
} 

https://developer.android.com/reference/android/os/Handler.html#post(java.lang.Runnable) आप देख सकते हैं, तो आप कार्रवाई कोड निष्पादित नहीं किया गया है तुरंत Handler.Post (कार्रवाई) द्वारा। इसे लूपर की संदेश कतार में जोड़ा जाता है, और यूआई थ्रेड के संदेश को संभालने के लिए निर्धारित होने पर इसे संभाला जाता है।

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

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