Android UI थ्रेड

अधिकांश Android एप्लिकेशन कोड गतिविधि, सेवा, ContentProvider या BroadcastReceiver जैसे घटकों के संदर्भ में चलता है। विचार करें कि थ्रेड के साथ इन घटकों का इंटरैक्शन एंड्रॉइड सिस्टम में कैसे व्यवस्थित है।

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

एप्लिकेशन घटकों के साथ Android सिस्टम की सहभागिता पर विचार करें।


गतिविधि। जब कोई उपयोगकर्ता मेनू आइटम का चयन करता है या ऑन-स्क्रीन बटन दबाता है, तो सिस्टम इस क्रिया को एक संदेश के रूप में नामित करेगा और इसे UI थ्रेड कतार में रखेगा।

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

BroadcastReceiver। प्रसारण संदेश बनाते समय, सिस्टम इसे मुख्य एप्लिकेशन थ्रेड की कतार में रखता है। मुख्य धागा बाद में ब्रॉडकास्टसीवर कोड को डाउनलोड करेगा जो इस प्रकार के संदेश के लिए पंजीकृत है और इसे निष्पादित करना शुरू करता है।

ContentProvider। स्थानीय ContentProvider को कॉल करना थोड़ा अलग है। ContentProvider मुख्य धागे में भी चलता है, लेकिन इसकी कॉल सिंक्रोनस है और ContentProvider कोड चलाने के लिए एक संदेश कतार का उपयोग नहीं करता है।

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

इस समस्या को हल करने के लिए, समानांतर प्रोग्रामिंग प्रतिमान का उपयोग किया जाता है। जावा में, इसका कार्यान्वयन निष्पादन के एक थ्रेड (थ्रेड) की अवधारणा का उपयोग करता है।

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



लेकिन, दुर्भाग्य से, उपयोगकर्ता बातचीत के लिए, धारा का कुछ उपयोग नहीं है। वास्तव में, यदि आप ऊपर दिए गए आरेख को ध्यान से देखते हैं, तो आप समझेंगे कि जैसे ही थ्रेड इसमें शामिल सभी निर्देशों को निष्पादित करता है, यह बंद हो जाता है और उपयोगकर्ता कार्यों को ट्रैक करना बंद कर देता है। इससे बचने के लिए, आपको निर्देश सेट में एक अनंत लूप को लागू करने की आवश्यकता है। लेकिन समस्या यह है कि कुछ कार्रवाई कैसे करें, उदाहरण के लिए, किसी अन्य स्ट्रीम से स्क्रीन पर कुछ प्रदर्शित करें, दूसरे शब्दों में, अंतहीन लूप में कैसे वेज करें। ऐसा करने के लिए, Android में, आप Android संदेश प्रणाली का उपयोग कर सकते हैं। इसमें निम्नलिखित भाग होते हैं:

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



संदेश : एक संदेश निर्देशों के एक सेट के लिए एक कंटेनर है जिसे दूसरे धागे में निष्पादित किया जाएगा।

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

public class LaunchActivity extends Activity { // time to display the splash screen in ms private final static long SPLASH_DELAY = 4000 * 0; private final Handler handler = new Handler(); private final Runnable splashTask = new Runnable() { @Override public void run() { finish(); } }; @Override protected void onResume() { super.onResume(); handler.removeCallbacks(splashTask); handler.postDelayed(splashTask, SPLASH_DELAY); } @Override protected void onPause() { handler.removeCallbacks(splashTask); super.onPause(); } } 


हैंडलरट्रेड : एक लूपर को लागू करने वाला थ्रेड कोड लिखना एक आसान काम नहीं हो सकता है, इसलिए उसी गलतियों को न दोहराएं। एंड्रॉइड सिस्टम में हैंडलरट्रेड क्लास शामिल है। नाम के विपरीत, यह वर्ग हैंडलर और लूपर को नहीं संभालता है।

इस दृष्टिकोण के व्यावहारिक कार्यान्वयन को एक उदाहरण के रूप में इंटेंट सर्विस क्लास के कोड का उपयोग करके अध्ययन किया जा सकता है; यह वर्ग अतुल्यकालिक नेटवर्क या अन्य अनुरोधों को करने के लिए अच्छी तरह से अनुकूल है, क्योंकि यह एक-एक करके कार्यों को प्राप्त कर सकता है, बिना मौजूदा प्रक्रिया के पूरा होने के इंतजार में और स्वतंत्र रूप से अपना काम पूरा करता है।

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

AndroidDevBlog पर आधारित है

Source: https://habr.com/ru/post/In142256/


All Articles