क्या , Activity.runOnUiThreadऔर View.post, किसी के बीच अंतर कर सकता है, कृपया, समझाएं?
क्या , Activity.runOnUiThreadऔर View.post, किसी के बीच अंतर कर सकता है, कृपया, समझाएं?
जवाबों:
कोई वास्तविक अंतर नहीं है, सिवाय इसके कि View.postमददगार तब हो जब आपके पास गतिविधि तक सीधी पहुंच न हो।
दोनों मामलों में, अगर यूआई थ्रेड पर नहीं, तो Handler#post(Runnable)पर्दे के पीछे कहा जाएगा।
जैसा कि कॉमन्सवेयर ने टिप्पणी में उल्लेख किया है, दोनों के बीच एक अंतर है - जब उई थ्रेड पर Activity#runOnUiThreadकॉल किया runजाता है, तो सीधे विधि को कॉल करेगा , जबकि कतार पर View#postपोस्ट करेगा runnable(जैसे कॉल Handler#post)
महत्वपूर्ण बिंदु IMO यह है कि दोनों का एक ही लक्ष्य है, और जो कोई भी इसका उपयोग करता है, उसके लिए कोई अंतर नहीं होना चाहिए (और कार्यान्वयन भविष्य में बदल सकता है)।
runOnUiThread()वर्तमान थ्रेड की जांच करता है और Runnableतुरंत होता है अगर हम मुख्य एप्लिकेशन थ्रेड पर होते हैं। post()हमेशा Runnableकतार पर रखता है , चाहे वह किसी भी धागे को कहा जाए।
runOnUiThread()वर्तमान थ्रेड को चेक करता है और Runnableतुरंत लागू होता है यदि हम मुख्य एप्लिकेशन थ्रेड पर होते हैं " (जोर दिया गया)। "क्या इसका मतलब है कि यूआई थ्रेड पर वर्तमान में जो भी है उसे अनदेखा किया गया है और इसे पहली प्राथमिकता दी गई है?" - "क्या कभी यूआई धागे पर वर्तमान में है" हैrunOnUiThread() कॉल।
Activity.runOnUiThread और view.post () के बीच एक और अंतर यह है कि view.post () में रननेबल को एक विंडो से जुड़ा होने के बाद कहा जाता है।
या तो ज्यादातर स्थितियों के लिए और सबसे अधिक भाग के वे परस्पर विनिमय कर रहे के लिए स्वीकार्य हैं, लेकिन वे कर रहे हैं आसानी से अलग। पाठ्यक्रम का सबसे बड़ा अंतर यह है कि एक से उपलब्ध है Activityऔर दूसरे से एक View। उन दोनों के बीच बहुत अधिक ओवरलैप है, लेकिन कभी-कभी Activityआप में एक्सेस नहीं होगा View, और कभी-कभी Viewआप में एक्सेस नहीं होगा Activity।
मेरे द्वारा सामना किए गए किनारे के मामलों View.postमें से एक,View.post मैंने एक और SO प्रश्न के उत्तर में उल्लेख किया है : View.postकेवल एक दूसरे धागे से काम करता है जब Viewएक खिड़की से जुड़ा होता है। यह शायद ही कभी एक समस्या है, लेकिन कभी-कभी पैदा कर सकता है Runnableपर अमल नहीं करने के लिए, खासकर यदि आप फोन View.postमें onCreateअपने की विधि Activity। एक विकल्प का उपयोग करना है Handler.postजो वैसे भी कवर के तहत क्या है Activity.runOnUiThreadऔर View.postउपयोग करता है।
(सटीकता के लिए संपादित, "दूसरे धागे से")
onCreate()भी अनासक्त हो ? हम्म, मैं इसे उस मामले में Handlerआपूर्ति करने के लिए पोस्ट करने की उम्मीद करूंगा ViewRoot।
View.postके Runnableलिए एक कतार में जोड़ना चाहिए । मैंने स्रोत में बहुत गहराई तक नहीं खोदा है, लेकिन डॉक्स कहते हैं: "यह विधि UI थ्रेड के बाहर से ही मंगाई जा सकती है, जब यह दृश्य एक विंडो से जुड़ा होता है।" इसलिए मुझे लगता है कि अगर यह मौजूदा धागे पर है, तो आपने जो कहा वह सच है, अगर यह नहीं है तो यह शायद बस निगल जाता है Runnable। मैं निश्चित रूप से मेरे कोड में हुआ था।