2011-10-28 16 views
28

किसी धागे या सेवा का उपयोग कब किया जाना चाहिए?Android में थ्रेड/सेवा का उपयोग कब करें?

क्या उन्हें प्रमाणीकरण के लिए उपयोग किया जाना चाहिए? उदाहरण के लिए, मेरे ऐप में मैं थ्रेड या सर्विस का उपयोग करने पर विचार कर रहा था (मैं सक्रिय निर्देशिका के माध्यम से प्रमाणीकरण कर रहा हूं।)

क्या आपके पास प्रत्येक का उपयोग होने के उदाहरण हैं?

उत्तर

23

एक थ्रेड को लंबे समय तक चलने वाली प्रक्रिया में उपयोग किया जाना चाहिए जो यूआई को अपडेट करने से रोक देगा। यदि यह एक या दो से अधिक है तो आप इसे पृष्ठभूमि थ्रेड में रखना चाहते हैं और उपयोगकर्ता को एक संवाद या स्पिनर या कुछ के साथ सूचित करना चाहते हैं। यदि आप यूआई थ्रेड को 5 सेकंड से अधिक समय तक लॉक करते हैं तो उपयोगकर्ता को ओएस द्वारा "मार या प्रतीक्षा" विकल्प के साथ संकेत दिया जाएगा।

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

+4

का उपयोग करके समाप्त हुआ 'एक सेवा अलग थ्रेड पर नहीं चलती है, इसलिए यह यूआई को अवरुद्ध कर देगा,' हम्म? सेवा में यूआई नहीं है। यह कौन सा ब्लॉक करने जा रहा है? –

+4

मुझे लगता है कि, आप कहने का मतलब था कि गतिविधि से सेवा कॉल कॉल की अवधि के लिए गतिविधि के यूआई को अवरुद्ध कर देगा। हो सकता है कि आपको इसे स्पष्ट करना चाहिए। –

+6

[एंड्रॉइड सर्विसेज] (http://developer.android.com/reference/android/app/Service.html) ओएस के यूआई थ्रेड को अवरुद्ध नहीं करेगा - "इसका मतलब है कि, यदि आपकी सेवा कोई भी करने जा रही है सीपीयू गहन (जैसे एमपी 3 प्लेबैक) या अवरुद्ध (जैसे नेटवर्किंग) संचालन, इसे अपने स्वयं के धागे को उस काम को करने के लिए तैयार करना चाहिए। " –

3

सेवा का उपयोग करें यदि आपको किसी अन्य चीज की आवश्यकता है या तो आपकी एप्लिकेशन गतिविधियों को बहिष्कृत किया गया है। सेवा का अच्छा उदाहरण फ़ाइल हस्तांतरण है जो लंबे समय तक ले सकता है और आप इस समय के दौरान अपने आवेदन का उपयोग कर उपयोगकर्ता को मजबूर नहीं करना चाहते हैं। अन्य मामलों में थ्रेड (आमतौर पर AsyncTask या इसी तरह के माध्यम से) का प्रयोग करें।

प्रमाणीकरण उद्देश्यों के लिए AsyncTask एक अच्छी पसंद की तरह लगता है।

+0

+1 AsyncTask – Cody

45

अद्यतन: ऐसा लगता है कि एंड्रॉइड दस्तावेज़ में अब एक स्पष्टीकरण शामिल है, http://developer.android.com/reference/android/app/Service.html#WhatIsAService देखें।

मूल जवाब:

एंड्रॉयड में, एक Service किसी भी समवर्ती निष्पादन ("पृष्ठभूमि में रन") प्रदान नहीं करता है। यह वास्तव में एक साधारण जावा ऑब्जेक्ट का अधिक है जो new के माध्यम से आपके एप्लिकेशन की बजाय एंड्रॉइड सिस्टम के माध्यम से केवल तत्काल (और प्रबंधित) है।

इसलिए सेवा की सबसे महत्वपूर्ण संपत्ति वर्कलोड को परिभाषित करने के बारे में नहीं है; यह सरल धागे के साथ हासिल किया जा सकता है।

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

तो, अगर आपको कुछ पृष्ठभूमि गतिविधियों की आवश्यकता होती है, तो केवल आपके आवेदन/Activity सक्रिय होने पर, एक धागा आपको जो चाहिए वह कर सकता है।

आप एक घटक है कि सक्रिय रहता है की जरूरत है भी साफ़ कर दिया नहीं होगा जब, कुछ समय के बाद, एंड्रॉयड सिस्टम स्मृति से अपने Activities को दूर करने का फैसला करता है, तो आप सेवा, या यहां तक ​​कि एक "अग्रभूमि सेवा" के लिए जाना चाहिए , जिसे सिस्टम द्वारा और भी महत्वपूर्ण माना जाता है और संसाधनों को पुनः प्राप्त करने के लिए भी कम होने की संभावना कम है।

बेशक

, अगर वांछित, एक Service वस्तु भी एक या अधिक Thread उदाहरण हैं जिनमें तो जब तक Service वस्तु ही रह सकता है को रोकने के लिए बनाया जा सकता है।

संपादित करें:

ओह, प्लस: एक सेवा है, निश्चित रूप से, अगर आप अन्य अनुप्रयोगों के लिए कुछ सेवा (ओं), उपलब्ध कराना चाहते हैं रास्ते जाने के लिए जो कर सकते हैं एक सेवा करने के लिए "बाँध" केवल ।

+1

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

+0

दस्तावेज़ के अनुसार, आपको अन्य अनुप्रयोगों से बाध्य होने वाली बाध्य सेवा की आवश्यकता होगी। –

1

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

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

1

प्रति Android डेवलपर गाइड (http://developer.android.com/guide/components/services.html#Basics) के रूप में:

एक सेवा के लिए बस एक घटक है कि पृष्ठभूमि में चला सकते हैं यहां तक ​​कि जब उपयोगकर्ता अपने आवेदन के साथ बातचीत नहीं कर रहा है। इस प्रकार, आपको केवल एक सेवा बनाना चाहिए यदि आपको यही चाहिए।

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

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

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