Android: AsyncTask बनाम सेवा


138

मैं यहां ज्यादातर सवालों के जवाब में क्यों पढ़ता हूं AsyncTaskऔर लोडर्स के बारे में बहुत कुछ है, लेकिन सेवाओं के बारे में कुछ भी नहीं ? क्या सेवाओं को केवल बहुत अच्छी तरह से नहीं जाना जाता है या क्या उन्हें पदावनत किया जाता है या उनके पास कुछ बुरी विशेषताएँ या कुछ हैं? क्या अंतर हैं?

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

जवाबों:


272

कुछ मामलों में एक ही कार्य को एक AsyncTaskया एक से पूरा करना संभव है, Serviceलेकिन आमतौर पर एक दूसरे की तुलना में एक कार्य के लिए बेहतर है।

AsyncTasks एक बार के समय लेने वाले कार्यों के लिए डिज़ाइन किए गए हैं जो UI थ्रेड को नहीं चला सकते हैं। जब बटन दबाया जाता है तो एक सामान्य उदाहरण डेटा प्राप्त / प्रसंस्करण होता है।

Services को पृष्ठभूमि में लगातार चलने के लिए डिज़ाइन किया गया है। एक बटन दबाए जाने पर डेटा लाने के ऊपर के उदाहरण में, आप एक सेवा शुरू कर सकते हैं, इसे डेटा लाने दें और फिर इसे रोकें, लेकिन यह अक्षम है। यह एक AsyncTaskबार उपयोग करने के लिए बहुत तेज़ है , एक बार चलेगा, डेटा वापस करेगा, और किया जाएगा।

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

इसके अलावा, जैसा कि शेरिफ ने पहले ही कहा था, जरूरी नहीं कि सेवाएं यूआई थ्रेड से दूर हों।

अधिकांश भाग के लिए, Serviceजब आप अपने एप्लिकेशन के Activityओपन न होने पर भी कोड चलाना चाहते हैं। AsyncTasks यूआई थ्रेड के कोडिंग कोड को अविश्वसनीय रूप से सरल बनाने के लिए डिज़ाइन किया गया है।


2
यह दिलचस्प है कि 2010 में Google I / O से इस बातचीत में youtube.com/watch?v=xHXn3Kg2IQE प्रस्तुतकर्ता REST API से डेटा प्राप्त करने के लिए 3 अलग-अलग तरीके देता है और पहले एक सेवा का उपयोग करता है। मैं एक एंड्रॉइड विशेषज्ञ नहीं हूं, लेकिन मैं इस धारणा के तहत था कि कंप्यूटर ने जो कहा है वह मूल रूप से सही है।
wuliwong

10
अंतिम पैराग्राफ, "जब आप कोड को तब भी चलाना चाहते हैं, जब आपके एप्लिकेशन की गतिविधि खुली नहीं है"। AsyncTask या बैकग्राउंड थ्रेड्स के मामले में भी यही है। जब आप अपनी गतिविधि या कॉल फ़िनिश () में वापस प्रेस करते हैं और आपकी गतिविधि दिखाई नहीं देती है, लेकिन तब भी आपकी पृष्ठभूमि थ्रेड तब तक निष्पादित होती है जब तक कि आप अपनी ऐप प्रक्रिया को नहीं मारते (उदाहरण के लिए हाल के कार्यों से अदला-बदली करके)। मैंने इसे 4.4.2 Google Nexus AOSP ग्रूपर
शिरीष हेरवाडे

10
हालाँकि, AsyncTask मुश्किल हो सकता है अगर शुरू की गई गतिविधि को मार दिया जाता है जबकि AsyncTask अभी भी चल रहा है और यूआई को एक बार अपडेट करने की आवश्यकता है ... (जो कि गतिविधि के नष्ट होने के बाद से काम नहीं करेगा)। क्यों एक IntentService का उपयोग न करें जो आपको मैन्युअल रूप से रोकने की आवश्यकता नहीं है, क्योंकि यह बस एक बार समाप्त हो जाता है?
AgentKnopf

सेवा के बारे में महान बिंदु। अच्छा स्पष्टीकरण। यह सेवा लगातार पृष्ठभूमि में चल रही है यहां तक ​​कि काम भी किया जाता है।
बाबू के

3
@LarsH मुझे सही करें यदि मैं गलत हूं, लेकिन मुझे लगता है कि आप अपनी गतिविधि / फ़्रैगमेंट में एक ब्रॉडकास्टर का उपयोग कर सकते हैं और इरादे से आप बस एक बार प्रसारण करने के बाद आग लगा सकते हैं। चूंकि आप गतिविधि / फ्रैगमेंट पुनः निर्माण पर ब्रॉडकास्ट के लिए फिर से पंजीकरण कर सकते हैं, जिसे आपको कवर करना चाहिए। UI को अपडेट करने के लिए एक अन्य विकल्प एक EventBus का उपयोग किया जाएगा (हालांकि मैं उन से बचने की कोशिश करता हूं - कोड का पालन करना कठिन बनाता है)।
AgentKnopf

58

सेवाएँ पूरी तरह से अलग हैं: सेवाएँ थ्रेड नहीं हैं !

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


हालाँकि AsyncTask, एक थ्रेड होता है जो बैकग्राउंड में कुछ काम करता है और उसी समय कॉलिंग थ्रेड में परिणाम रिपोर्ट करने की क्षमता रखता है।

बस एक विचार: एक सेवा में एक AsyncTaskवस्तु हो सकती है !


2
सेवाओं को पृष्ठभूमि में चलने के रूप में वर्णित किया जाता है, यहां तक ​​कि जब उर एप्लिकेशन बंद होता है तब भी जारी रहता है। AsyncTask का उपयोग बैकग्राउंड में कुछ करने के लिए भी किया जाता है। पता है क्या मेरा मतलब है?
erikbwork

1
हाँ, लेकिन सेवाएँ कुछ कर सकती हैं या नहीं भी कर सकती हैं। वे एक लंबे समय तक रहने वाले OBJECT
Sherif elKhatib

"एक सेवा में एक AsyncTask ऑब्जेक्ट हो सकता है!" यह बात बताने के लिए धन्यवाद। लेकिन क्या यह एक अच्छा विचार है - यह कुछ ऐसा है जिसे आप सुझाएंगे? या एक सेवा में अधिक बुनियादी थ्रेडिंग तकनीकों का उपयोग करना बेहतर होगा?
RenniePet

"आपकी गतिविधि एक सेवा के लिए बाध्य करती है" जरूरी नहीं।
JacksOnF1re

@ JacksOnF1re मुझे पता है कि यह तब है जब मैंने पहली बार कोडिंग शुरू की थी: पी लेकिन "आपकी गतिविधि एक सेवा के लिए बाध्य करती है" एक सच्चा कथन है। मैं भी इस सेवा के लिए बाध्य हो सकता है। एक रेफ्रिजरेटर भी बाध्यकारी हो सकता है। यह कथन को अमान्य नहीं बनाता है .. वैसे भी jk
Sherif elKhatib

7

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

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


क्या आप यह बता सकते हैं कि आपको क्यों लगता है कि आपका उत्तर प्रश्न से कुछ जोड़ता है?
erikbwork 20

2
अन्य उत्तर शुरुआती समझने के लिए या तो बहुत कम हैं या बहुत लंबे हैं। इसलिए मैंने उदाहरण के साथ सरल शब्दों में सटीक उत्तर दिया
अर्जुन

6

सेवा और एसिंक्चुएक्स लगभग एक ही काम कर रहे हैं, लगभग .use सेवा या एक एसिंक्टस्क इस बात पर निर्भर करता है कि आपकी आवश्यकता क्या है।

एक उदाहरण के रूप में यदि आप कुछ बटन मारने या स्क्रीन को बदलने के बाद किसी सर्वर से किसी सूची में डेटा लोड करना चाहते हैं तो आप asynctask.it के साथ चलते हैं जो मुख्य ui थ्रेड (पृष्ठभूमि में रन) के साथ समानांतर चलता है। asynctack गतिविधि या इस ऐप को चलाना चाहिए। मुख्य UI थ्रेड पर। एप से बाहर निकलने के बाद कोई एसिंक्टस्क नहीं है।

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

खुश कोडिंग।


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

3
फिर मुझे पता है कि उत्तर पहले से ही दिया गया है और मुझे यहाँ बहुत समस्या नहीं दिखती अगर मैं सही उत्तर देता हूँ या यहाँ मेरी राय है भाई? क्योंकि आप केवल वही नहीं हैं जो एक ही प्रश्न के उत्तर की तलाश कर रहे हैं, अगर कोई व्यक्ति उपरोक्त उत्तर में समाधान को समझना मुश्किल है, तो वह नीचे एक उत्तर की तलाश में स्क्रॉल कर सकता है जो उनके लिए अच्छी तरह से फिट है, आसानी से एक समझ लेता है। टिप्पणी भाई के लिए धन्यवाद, im नहीं एक प्रतिभाशाली या प्रोग्रामिंग में समर्थक, बस दूसरों की मदद करना चाहते हैं, दूसरों को सिखाने की कोशिश करें जो मुझे पहले से ही पता है :)
Ashana.Jackol

1

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

उदाहरण: यदि आप एक संगीत चलाना चाहते हैं और यदि उपयोगकर्ता ऐप नहीं छोड़ता है, तो आप निश्चित रूप से सेवा के लिए जाएंगे।


1

स्थानीय, इन-प्रोसेस, बेस क्लास सर्विस की तुलना an a AsyncTask:

Not (यह उत्तर निर्यात की गई सेवाओं, या क्लाइंट से भिन्न प्रक्रिया में चलने वाली किसी भी सेवा को संबोधित नहीं करता है, क्योंकि अपेक्षित उपयोग के मामले उन लोगों से काफी भिन्न होते हैं AsyncTask। इसके अलावा, संक्षिप्तता के हित में, कुछ विशेष की प्रकृति। Serviceउपवर्गों (जैसे, IntentService, JobService) यहाँ नजरअंदाज कर दिया जाएगा।)

प्रक्रिया जीवनकाल

एक ServiceOS का प्रतिनिधित्व करता है, "उपयोगकर्ता के साथ बातचीत न करते हुए एक लंबे समय तक चलने वाले ऑपरेशन को करने के लिए एक एप्लिकेशन की इच्छा" [ रेफ ]।

जब आपके पास एक Serviceरनिंग होती है, तो एंड्रॉइड समझता है कि आप नहीं चाहते कि आपकी प्रक्रिया को मार दिया जाए। यह तब भी सच है जब आपके पास एक Activityऑनस्क्रीन है, और यह विशेष रूप से सच है जब आप एक अग्रभूमि सेवा चला रहे हैं । (जब आपके सभी एप्लिकेशन घटक चले जाते हैं, तो एंड्रॉइड सोचता है, "ओह, अब इस ऐप को मारने का एक अच्छा समय है, इसलिए मैं संसाधनों को मुक्त कर सकता हूं"।)

इसके अलावा, Service.onCreate()एंड्रॉइड से अंतिम रिटर्न मान के आधार पर , उन ऐप्स / सेवाओं को "पुनर्जीवित" करने का प्रयास कर सकते हैं जो संसाधन दबाव [ रेफ ] के कारण मारे गए थे ।

AsyncTasksऐसा कुछ भी मत करो। इससे कोई फर्क नहीं पड़ता कि आपके पास कितने बैकग्राउंड थ्रेड चल रहे हैं, या वे कितनी मेहनत कर रहे हैं: एंड्रॉइड आपके ऐप को केवल इसलिए जीवित नहीं रखेगा क्योंकि आपका ऐप सीपीयू का उपयोग कर रहा है। यह जानने का कोई तरीका है कि आपके ऐप में अभी भी काम करना है; यही कारण है कि Servicesओएस के साथ पंजीकृत हैं, और AsyncTasksनहीं।

बहु सूत्रण

AsyncTasks सभी एक पृष्ठभूमि धागा बनाने के बारे में हैं, जिस पर काम करना है, और फिर उस कार्य का परिणाम यूआई थ्रेड्स में थ्रेडसेफ़ तरीके से प्रस्तुत करना है।

प्रत्येक नए AsyncTaskनिष्पादन में आम तौर पर अधिक समरूपता (अधिक थ्रेड्स) होते हैं, जो AsyncTasks'sथ्रेड-पूल [ रेफ ] की सीमाओं के अधीन होते हैं ।

Serviceदूसरी ओर, तरीकों को हमेशा यूआई थ्रेड [ रेफ ] पर लगाया जाता है । इस पर लागू होता है onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), आदि तो, कुछ अर्थों में, Servicesनहीं "रन" पृष्ठभूमि में है। एक बार जब वे शुरू हो जाते हैं ( onCreate()), तो वे थोड़े से "बैठते हैं" - जब तक कि सफाई करने का समय नहीं है, तब तक ए, निष्पादित करें onStartCommand()आदि।

दूसरे शब्दों में, अतिरिक्त जोड़ने Servicesसे अधिक संगामिति नहीं होती है। सेवा विधियां बड़ी मात्रा में काम करने के लिए एक अच्छी जगह नहीं हैं, क्योंकि वे यूआई थ्रेड पर चलते हैं

बेशक, आप Serviceअपने स्वयं के तरीकों को बढ़ा सकते हैं , जोड़ सकते हैं और उन्हें किसी भी थ्रेड से कॉल कर सकते हैं। लेकिन अगर आप ऐसा करते हैं, तो थ्रेड सेफ्टी की जिम्मेदारी आपके साथ होती है - फ्रेमवर्क की नहीं।

यदि आप अपने लिए एक बैकग्राउंड थ्रेड (या किसी अन्य प्रकार का वर्कर) जोड़ना चाहते Serviceहैं, तो आप ऐसा करने के लिए स्वतंत्र हैं। आप एक पृष्ठभूमि धागा शुरू कर सकता है / AsyncTaskमें Service.onCreate()उदाहरण के लिए,। लेकिन सभी उपयोग मामलों में इसकी आवश्यकता नहीं होती है। उदाहरण के लिए:

  • आप एक Serviceचालू रखना चाह सकते हैं ताकि आप "पृष्ठभूमि" में स्थान अपडेट प्राप्त करना जारी रख सकें (मतलब, बिना किसी Activitiesऑनस्क्रीन के)।
  • या, आप अपने ऐप को जीवित रखना चाह सकते हैं, ताकि आप BroadcastReceiverएक लंबी अवधि के आधार पर पंजीकृत "निहित" रख सकें (एपीआई 26 के बाद, आप इसे हमेशा मैनिफ़ेस्ट के माध्यम से नहीं कर सकते हैं, इसलिए आपको इसके बजाय रनटाइम पर पंजीकरण करना होगा [ रेफ ]]।

इन उपयोग मामलों में से किसी को भी सीपीयू गतिविधि की बहुत आवश्यकता नहीं है; उन्हें बस यह चाहिए कि ऐप को न मारा जाए

कार्यकर्ता के रूप में

Servicesकार्य-उन्मुख नहीं हैं। वे "एक कार्य करने के लिए" और "एक परिणाम देने के लिए" सेट नहीं हैं, जैसे AsyncTasksहैं। Servicesकिसी भी थ्रेड-सुरक्षा समस्याओं को हल न करें (इस तथ्य के बावजूद कि सभी विधियाँ एक ही थ्रेड पर निष्पादित होती हैं)। AsyncTasksदूसरी ओर, आपके लिए उस जटिलता को संभालें।

ध्यान दें कि AsyncTaskहै समाप्त होने वाली । लेकिन इसका मतलब यह नहीं है कि आपके AsyncTasksसाथ आपकी जगह होनी चाहिए Services! (यदि आपने इस उत्तर से कुछ भी सीखा है, तो यह स्पष्ट होना चाहिए।)

टी एल; डॉ

Servicesज्यादातर "मौजूद" हैं। वे एक ऑफ-स्क्रीन की तरह हैं Activity, जिससे एप्लिकेशन को जीवित रहने का कारण मिलता है, जबकि अन्य घटक "काम" करने का ध्यान रखते हैं। AsyncTasks"काम" करते हैं, लेकिन वे स्वयं की प्रक्रिया को जीवित नहीं रखेंगे।

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