सेवा, Async टास्क और थ्रेड के बीच अंतर?


147

सेवा, Async टास्क और थ्रेड में क्या अंतर है। अगर मैं गलत नहीं हूँ तो उन सभी का उपयोग पृष्ठभूमि में कुछ सामान करने के लिए किया जाता है। तो, कैसे तय करें कि किसका उपयोग करना है और कब?


ऐसा लगता है कि एक और चीज है जिसके साथ लोग अक्सर भ्रमित हो सकते हैं - लोडर । संबंधित थ्रेड - Asynctask बनाम थ्रेड बनाम सेवा बनाम लोडर
RBT

जवाबों:


186

संभवतः आप पहले से ही उनके बारे में दस्तावेज़ीकरण विवरण पढ़ चुके हैं, मैं उन्हें नहीं दोहराऊंगा, इसके बजाय मैं अपने शब्दों के साथ जवाब देने की कोशिश करूंगा, आशा है कि वे आपकी मदद करेंगे।

  • सेवा एक गतिविधि की तरह है, लेकिन इसका कोई उपयोगकर्ता इंटरफ़ेस नहीं है। संभवतः यदि आप उदाहरण के लिए मौसम लाना चाहते हैं तो आप इसके लिए कोई रिक्त गतिविधि नहीं बनाएंगे, इसके लिए आप किसी सेवा का उपयोग करेंगे।

  • एक धागा एक धागा है, शायद आप पहले से ही इसे दूसरे भाग से जानते हैं। आपको यह जानना होगा कि आप थ्रेड से UI को अपडेट नहीं कर सकते। आपको इसके लिए एक हैंडलर का उपयोग करने की आवश्यकता है, लेकिन आगे पढ़ें।

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

मैं अक्सर सेवाओं, AsyncTasks का उपयोग कर रहा हूं। थ्रेड कम, या बिल्कुल नहीं, क्योंकि मैं लगभग सब कुछ AsyncTask के साथ कर सकता हूं।


1
आपके व्याख्या के लिये धन्यवाद। तो, अगर मुझे एक एप्लिकेशन बनाने की ज़रूरत है जो वेब से डेटा प्राप्त करता है, जो कि एक बेहतर विकल्प सेवा या async कार्य होगा?
स्पंकरबबा

16
आपको दोनों का उपयोग करने की आवश्यकता है। आप एक सेवा बनाते हैं और उसके अंदर आप AsyncTask का उपयोग करते हैं।
पेंटियम

4
उपरोक्त उत्तर में जोड़ें, AsyncTask 4 चरणों onPreExecute (), onProgressUpdate (प्रगति ...) onPostExecute (परिणाम), {UI थ्रेड में चल रहा है}, doInBackground (परम्स ...) {बैकग्राउंड थ्रेड में चल रहा है] के माध्यम से जाता है। चूंकि यह UI थ्रेड में 3 तरीके प्रदान करता है, उपयोगकर्ता को यूआई को अपडेट करने के लिए हैंडलर या कॉलबैक का उपयोग करने के बारे में चिंता करने की आवश्यकता नहीं है।
SpunkerBaba

11
@ Pentium10: सेवा + AsyncTask के बजाय, आप अक्सर
njzk2

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

23

यह आपके प्रश्न का सबसे आसान उत्तर है

धागा

निष्पादन की एक इकाई है जो "थ्रेड" को मुख्य थ्रेड पर चलाता है एक महत्वपूर्ण बिंदु है, आप किसी भी थ्रेड से यूआई घटक को किसी भी थ्रेड को छोड़कर यहां अपडेट नहीं कर सकते।

AsyncTask

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

सर्विस

उपरोक्त समस्या को हल करें क्योंकि यह उस गतिविधि से अलग रहती है जो इसे लागू करती है, इसलिए यह तब भी चलती रह सकती है जब गतिविधि नष्ट हो जाती है, यह मेन थ्रेड में चलती है (ANR से सावधान) एक पृष्ठभूमि सेवा का उपयोग करें (IntentService का विस्तार करें) यह स्वचालित रूप से कार्यकर्ता थ्रेड बनाता है तुम्हारे लिए)सेवा यूआई के बिना एक गतिविधि की तरह है , लंबे कार्य के लिए अच्छा है


4
AyncTask को डिवाइस को घुमाने पर फिर से नहीं बनाया जाएगा क्योंकि यह गतिविधि जीवनचक्र विधियों के साथ सिंक में नहीं है।
कोप्सऑनरॉड

4
आप एक गतिविधि जीवन चक्र हुक में AsyncTask बनाते हैं और जब आप फोन घुमाते हैं तो गतिविधि नष्ट हो जाती है और पुनरारंभ हो जाती है। AsyncTask का प्रीवियस उदाहरण उस गतिविधि से जुड़ा हुआ है जिसे आपने अभी नष्ट किया है और इस कारण से आपको "फोर्स क्लोज़" मिलेगा, लेकिन आप यह भी देखेंगे कि कैसे असिनटैस्क का नया उदाहरण फिर से ट्रिगर हो रहा है। आप AsyncTask को बनाए रखने के लिए Fragments का उपयोग कर सकते हैं और Fragment पर setRetainInstance (true) सेट करें जो आपकी मदद करेगा।
अलेजांद्रो सीरेट

15

कुछ और जानकारी मैं चाहता हूँ कि किसी ने मुझे कुछ दिन पहले बताया था:

  • आप वैश्विक चर साझा कर सकते हैं - जैसे कि धागे - गतिविधियों और सेवाओं के बीच।
  • जब तक कोई गतिविधि या सेवा अभी भी मौजूद है, तब तक उसके सभी वैश्विक चरों के साथ आपके आवेदन को मिटा नहीं दिया जाएगा।
  • यदि आपके ऐप में किसी सेवा का उदाहरण है और OS को संसाधनों की आवश्यकता है, तो यह सबसे पहले आपकी गतिविधियों को मारता है, लेकिन जब तक सेवा है, OS आपके ग्लोबल वैरिएबल के साथ आपके एप्लिकेशन को मिटा नहीं देगा।

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


9

संक्षेप में, सेवा के लिए time consuming tasks, AsyncTask के लिए short-lived tasks, थ्रेड एक standard java constructionथ्रेड के लिए है।


3

डेवलपर के दृष्टिकोण से:

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

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

सेवा : एक पृष्ठभूमि प्रक्रिया है। यह तब नियोजित किया जाता है जब आपको कुछ ऐसी प्रोसेसिंग करनी होती है जिसमें कोई UI नहीं जुड़ा होता है।


1
Serviceजब तक आप उपयोग नहीं करते तब तक पृष्ठभूमि में आवश्यक रन नहीं होगा IntentService। यदि आपने ServiceUiThread से एक standart शुरू किया है तो यह UiThread पर चलेगा।
यशख

@yshahak आप सही हैं, लेकिन यहां हमें गहरी परिभाषा की आवश्यकता नहीं है। उपयोगकर्ता केवल उनके बीच अंतर जानना चाहते हैं।
राहुल रैना

हां, लेकिन यह सटीक नहीं है, क्योंकि Serviceडिफ़ॉल्ट रूप से एक अलग प्रक्रिया में नहीं चलेगा, लेकिन अन्य घटकों के साथ ऐप प्रक्रिया में। यह कहने के लिए बेहतर है कि Serviceथ्रेड की पृष्ठभूमि में चलेगा कि यह अंदर रहता है।
यशक

उपरोक्त सभी तीन आवेदन प्रक्रिया के भीतर काम करते हैं। ASyncTask के प्रीएक्स्यूट () और पोस्टएक्स्यूट () तरीके यूआईह्रेड और doInBackground () और ऑनप्रोग्रेड () बैकग्राउंड थ्रेड पर काम करता है। बैकग्राउंड थ्रेड पर सेवा काम करती है और थ्रेड बैकग्राउंड थ्रेड पर भी काम करता है। हालाँकि हैंडलर UI थ्रेड पर काम करता है।
राहुल रैना

2

सेवा लंबे समय तक काम करने वाली गतिविधि की तरह है, लेकिन Async कार्य हमें लंबे / पृष्ठभूमि संचालन करने और थ्रेड में हेरफेर किए बिना UI परिणाम पर अपना परिणाम दिखाने की अनुमति देता है।

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