Android: Activity.runOnUiThread और View.post में क्या अंतर है?


97

जवाबों:


104

कोई वास्तविक अंतर नहीं है, सिवाय इसके कि View.postमददगार तब हो जब आपके पास गतिविधि तक सीधी पहुंच न हो।

दोनों मामलों में, अगर यूआई थ्रेड पर नहीं, तो Handler#post(Runnable)पर्दे के पीछे कहा जाएगा।

जैसा कि कॉमन्सवेयर ने टिप्पणी में उल्लेख किया है, दोनों के बीच एक अंतर है - जब उई थ्रेड पर Activity#runOnUiThreadकॉल किया runजाता है, तो सीधे विधि को कॉल करेगा , जबकि कतार पर View#postपोस्ट करेगा runnable(जैसे कॉल Handler#post)

महत्वपूर्ण बिंदु IMO यह है कि दोनों का एक ही लक्ष्य है, और जो कोई भी इसका उपयोग करता है, उसके लिए कोई अंतर नहीं होना चाहिए (और कार्यान्वयन भविष्य में बदल सकता है)।


70
एक अंतर: runOnUiThread()वर्तमान थ्रेड की जांच करता है और Runnableतुरंत होता है अगर हम मुख्य एप्लिकेशन थ्रेड पर होते हैं। post()हमेशा Runnableकतार पर रखता है , चाहे वह किसी भी धागे को कहा जाए।
कॉमन्सवेयर

धन्यवाद, मैं अब आपके स्पष्टीकरण और @CommonsWare टिप्पणी के आधार पर अंतर देख सकता हूं।
अलेक्जेंडर कुलाख़्तिन

4
@Ashwin: "आपने कहा runOnUiThread () Runnable को तुरंत निष्पादित करता है" - नहीं, मैंने नहीं किया। कृपया टिप्पणी फिर से पढ़ें। मैंने कहा कि " runOnUiThread()वर्तमान थ्रेड को चेक करता है और Runnableतुरंत लागू होता है यदि हम मुख्य एप्लिकेशन थ्रेड पर होते हैं " (जोर दिया गया)। "क्या इसका मतलब है कि यूआई थ्रेड पर वर्तमान में जो भी है उसे अनदेखा किया गया है और इसे पहली प्राथमिकता दी गई है?" - "क्या कभी यूआई धागे पर वर्तमान में है" हैrunOnUiThread() कॉल।
कॉमन्सवेयर

1
@ barn.gumbl: इस मामले में, मैंने स्रोत को देखा।
कॉमन्सवेयर सेप

1
वहाँ है एक फर्क। एक दृश्य पर पोस्ट करना जो खिड़की से जुड़ा नहीं है, कुछ भी नहीं करेगा। यद्यपि बहुत बड़ा अंतर नहीं है , यह सूक्ष्म कीड़े पैदा कर सकता है और नेविगेट करने के लिए काफी कष्टप्रद है यदि आपको पता नहीं है कि अंतर मौजूद है।
dcow

23

Activity.runOnUiThread और view.post () के बीच एक और अंतर यह है कि view.post () में रननेबल को एक विंडो से जुड़ा होने के बाद कहा जाता है।


आपको कैसे दिखाया जाता है? दिखाई देता है? अदृश्य दृश्य पर नहीं कहा जाता है?
अलेक्जेंडर कुलाखतिन

एलेक्स को अस्पष्टता को ठीक किया।
पैरेशगोएल

5
यह सबसे महत्वपूर्ण अंतर IMHO है। बहुत सारे लोग view.post () का उपयोग करता है सामान को निष्पादित करने के लिए जिसे देखने के बाद निष्पादित करने की आवश्यकता होती है।
सोती

3
यह सच नहीं है। यह कभी भी सही नहीं रहा है, लेकिन कुछ बिंदु पर View.java के लिए JavaDoc ने गलत तरीके से बताया कि "View.post केवल किसी अन्य थ्रेड से काम करता है जब व्यू एक विंडो से जुड़ा होता है"। यह 15 अक्टूबर 2012 को तय किया गया था , लेकिन एंड्रॉइड डेवलपर्स के दिमाग में घुसने में थोड़ा समय लगा।
एलेक्स कोहेन

इस अंतर के लिए @pareshgoel स्रोत?
प्रेषित

17

या तो ज्यादातर स्थितियों के लिए और सबसे अधिक भाग के वे परस्पर विनिमय कर रहे के लिए स्वीकार्य हैं, लेकिन वे कर रहे हैं आसानी से अलग। पाठ्यक्रम का सबसे बड़ा अंतर यह है कि एक से उपलब्ध है 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उपयोग करता है।

(सटीकता के लिए संपादित, "दूसरे धागे से")


1
यह असफल हो सकता है जब इसमें onCreate()भी अनासक्त हो ? हम्म, मैं इसे उस मामले में Handlerआपूर्ति करने के लिए पोस्ट करने की उम्मीद करूंगा ViewRoot
जेन्स

5
@ जेन्स हाँ, मैंने स्रोत पर नज़र रखी है और यदि इसे अभी तक संलग्न नहीं किया गया है तो इसे बाद में निष्पादित करने View.postके Runnableलिए एक कतार में जोड़ना चाहिए । मैंने स्रोत में बहुत गहराई तक नहीं खोदा है, लेकिन डॉक्स कहते हैं: "यह विधि UI थ्रेड के बाहर से ही मंगाई जा सकती है, जब यह दृश्य एक विंडो से जुड़ा होता है।" इसलिए मुझे लगता है कि अगर यह मौजूदा धागे पर है, तो आपने जो कहा वह सच है, अगर यह नहीं है तो यह शायद बस निगल जाता है Runnable। मैं निश्चित रूप से मेरे कोड में हुआ था।
काबुको

@kabuko धन्यवाद आपका उत्तर किसी अन्य बिंदु से दिखाता है। मैं यह कैसे स्वीकार कर सकता हूं कि 1 से अधिक उत्तर को तर्क के पीछे नहीं देखा जा सकता है जो मेटा फ़ोरम को स्वीकार करेगा
अलेक्जेंडर कुलाख़्तिन

3
यह सच नहीं है। यह कभी भी सही नहीं रहा है, लेकिन कुछ बिंदु पर View.java के लिए JavaDoc ने गलत तरीके से बताया कि "View.post केवल किसी अन्य थ्रेड से काम करता है जब व्यू एक विंडो से जुड़ा होता है"। यह 15 अक्टूबर 2012 को तय किया गया था , लेकिन एंड्रॉइड डेवलपर्स के दिमाग में घुसने में थोड़ा समय लगा।
एलेक्स कोहेन

0

एक और अंतर: postप्रति दृश्य है; runOnUiThreadप्रति गतिविधि है।

इसका मतलब यह है कि यह भविष्य में ( view.getQueue/ ?) करना संभव है activity.getQueueऔर अपने स्वयं के ट्रैकिंग या फ़िल्टरिंग कोड के बिना वही प्राप्त करें जो आप चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.