2010-09-06 23 views
69

क्या कोई मुझे समझा सकता है कि यूआई थ्रेड वास्तव में क्या है? developer.android.com पर यह runOnUiThread समारोह के बारे में कहते हैंएंड्रॉइड यूआई थ्रेड (यूआई थ्रेड)

सार्वजनिक अंतिम शून्य runOnUiThread (Runnable कार्रवाई)

के बाद से: एपीआई स्तर 1 रन यूआई धागे पर निर्दिष्ट किया गया कार्य। यदि वर्तमान थ्रेड यूआई थ्रेड है, तो कार्रवाई तुरंत निष्पादित की जाती है। यदि वर्तमान धागा UI थ्रेड नहीं है, तो कार्रवाई UI थ्रेड की ईवेंट कतार में पोस्ट की गई है।

क्या यूआई थ्रेड का मतलब यह है कि जब भी इनकमिंग कॉल या स्क्रीन डाimming इत्यादि जैसी कुछ यूई गतिविधि द्वारा पृष्ठभूमि को पृष्ठभूमि को धक्का दिया जाता है तो यह हर बार चलाया जाएगा? यदि नहीं, तो यूआई थ्रेड में वास्तव में क्या शामिल है?

आप

उत्तर

129

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

उदाहरण के लिए, मान लीजिए कि आपका एप्लिकेशन एक एकल गतिविधि वर्ग है। फिर जीवन भर के सभी तरीकों और आपके इवेंट हैंडलिंग कोड का अधिकांश हिस्सा इस यूआईटीएचड में चलाया जाता है। ये onCreate, , onDestroy, onClick इत्यादि जैसी विधियां हैं। इसके अतिरिक्त, यह वह जगह है जहां यूआई के सभी अपडेट किए जाते हैं। यूआई थ्रेड पर होने वाली यूआई को अपडेट या बदलने के लिए जो भी कुछ भी हो रहा है।

For more info on your application's Processes and Threads click here.

जब आप स्पष्ट रूप से पृष्ठभूमि में काम करने के लिए एक नया धागा अंडे, इस कोड UIThread पर नहीं चल रहा है। तो क्या होता है यदि इस पृष्ठभूमि धागे को यूआई को बदलने वाले कुछ ऐसा करने की ज़रूरत है? यह runOnUiThread के लिए है। असल में आप हैंडलर का उपयोग करना चाहते हैं (इस पर अधिक जानकारी के लिए नीचे दिए गए लिंक को देखें)। यह इन पृष्ठभूमि धागे को कोड को निष्पादित करने की क्षमता प्रदान करता है जो यूआई को संशोधित कर सकता है। वे यूआई-संशोधित कोड को एक रननेबल ऑब्जेक्ट में डालकर इसे runOnUi थ्रेड विधि में पास करके करते हैं।

For more info on spawning worker threads and updating the UI from them click here

मैं व्यक्तिगत रूप से सिर्फ अपने इंस्ट्रूमेंटेशन टेस्ट मैचों में runOnUiThread विधि का उपयोग करें। चूंकि परीक्षण कोड UIThread में निष्पादित नहीं होता है, इसलिए आपको UI को संशोधित करने वाले कोड को चलाने के लिए इस विधि का उपयोग करने की आवश्यकता है। इसलिए, मैं इसे अपने आवेदन में क्लिक और कुंजी घटनाओं को इंजेक्ट करने के लिए उपयोग करता हूं। फिर मैं यह सुनिश्चित करने के लिए आवेदन की स्थिति की जांच कर सकता हूं कि सही चीजें हुईं।

For more info on testing and running code on the UIThread click here

+3

ग्रेट स्पष्टीकरण, विशेष रूप से ऐप मौलिक सिद्धांतों के लिए लिंक यह मेरे जैसे सभी शुरुआती लोगों के लिए पढ़ना चाहिए :) –

+1

क्या आप ज्यादातर मामलों में 'runOnUiThread' के बजाय' AsyncTask' का उपयोग नहीं करना चाहिए? – JDJ

+3

@ जेडीजे 2 तकनीकों के अलग-अलग उद्देश्यों हैं: 'AsyncTask' आपको पृष्ठभूमि में मुख्य धागे को बंद कर देगा; 'runOnUiThread()' आपको पृष्ठभूमि से मुख्य धागे पर ले जाएगा। तो यह निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। –

3

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

+0

क्या आप एक गैर यूआई थ्रेड में विजेट डेटा संरचनाएं (जैसे लेआउट को फुलाएं) तैयार कर सकते हैं और फिर उन्हें यूआई थ्रेड में खींच सकते हैं? –

+0

ने कभी कोशिश नहीं की लेकिन तकनीकी रूप से यह संभव होना चाहिए, क्योंकि inflate सिर्फ डेटा संरचना बनाता है। जब आप संलग्न करते हैं तो इसका हिस्सा एक गतिविधि आदि है, जब आपको इसे यूआईटीएचड संदर्भ में करने की आवश्यकता होती है। – the100rabh

8

आप कोड को अवरुद्ध पर अमल करते हैं (उदा एक Http-अनुरोध) एक अलग थ्रेड में, AsyncTask उपयोग करने पर विचार। इसका doInBackground -Method एक अलग थ्रेड पर चलता है।AsyncTask आपको विधियों onProgressUpdate और onPostExecute प्रदान करता है जो यूआई थ्रेड पर चलाने की गारंटी देते हैं।

यदि आपको जीयूआई-प्रगति अपडेट की आवश्यकता है (उदाहरण के लिए प्रोग्रेसबार के माध्यम से) publishProgressdoInBackground के अंदर कॉल करें। इससे onPublishProgress की अगली कॉल की ओर जाता है।

onPostExecute स्वचालित रूप से doInBackground रिटर्न के बाद बुलाया जाता है।

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