हैंडलर बनाम AsyncTask


128

मैं उलझन में हूँ कि जब कोई एक हैंडलर के ऊपर AsyncTask का चयन करेगा। कहो मेरे पास कुछ कोड हैं जो मैं हर एन सेकंड चलाना चाहता हूं जो यूआई को अपडेट करेगा। मैं एक को दूसरे पर क्यों चुनूंगा?


1
यह AsyncTaskLaders के साथ अधिक जटिल हो गया है। अधिक जानकारी के लिए stackoverflow.com/q/7120813/969325 देखें ।
वारपज़िट

जवाबों:


75

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

हालांकि, यह ध्यान रखना महत्वपूर्ण है कि AsyncTask का उपयोग करते समय, एक डेवलपर अपनी सीमाओं के लिए प्रस्तुत कर रहा है, जिसके परिणामस्वरूप वर्ग के लेखक ने डिजाइन निर्णयों के कारण। उदाहरण के लिए, मुझे हाल ही में पता चला है कि उन नौकरियों की संख्या की सीमा है जो AsyncTasks का उपयोग करके निर्धारित की जा सकती हैं।

हैंडलर दोनों का अधिक पारदर्शी है और शायद आपको अधिक स्वतंत्रता देता है; इसलिए यदि आप चीजों पर अधिक नियंत्रण चाहते हैं तो आप हैंडलर का चयन करेंगे अन्यथा असिनटस्क ठीक काम करेगा।


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

5
हनीकॉम्ब से, AsyncTasksएक धागे पर निष्पादित किया जाता है, इसलिए अब कोई समानता नहीं है। आप अभी भी उन्हें एक पार्सल Executorकार्यान्वयन पर चला सकते हैं ।
MrSnowflake

63

अंगूठे का मेरा नियम होगा:

  • यदि आप UI से संबंधित कुछ अलग कर रहे हैं, उदाहरण के लिए किसी सूची में प्रस्तुत करने के लिए डेटा डाउनलोड करना, आगे बढ़ें और उपयोग करें AsyncTask

  • यदि आप कई बार दोहराए जाने वाले कार्य कर रहे हैं, उदाहरण के लिए, कई छवियों को डाउनलोड करने के लिए जिन्हें डाउनलोड करने पर ImageViews(जैसे थंबनेल डाउनलोड करने में) प्रदर्शित किया जाना है , के साथ एक कार्य कतार का उपयोग करें Handler


हैंडलर एपीआई स्तर 1 में है और एपीआई स्तर 3 में ASYNCTASK है। क्या इसे किसी भी कीमत पर निकाला जाएगा?
डेबाज़

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

क्या आपको अपने UI को प्रस्तुत करने के लिए डेटा लोड करने के लिए लोडर का उपयोग नहीं करना चाहिए?
नबराइली

19

मुख्य रूप से निम्नलिखित कारणों से जब संभव हो तो हमेशा AsyncTask का उपयोग करने से बचने की कोशिश करें:

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

  • गतिविधि जीवनचक्र पर निर्भर करते हुए, चलने पर भी, AsyncTask को स्वचालित रूप से समाप्त किया जा सकता है

  • UI थ्रेड पर चल रहे AsyncTask तरीके, onPostExecute की तरह निष्पादित किए जा सकते हैं, जब यह जिस गतिविधि का उल्लेख कर रहा है, वह अब दिखाई नहीं दे रही है, या संभवतः एक अलग लेआउट स्थिति में है, जैसे ओरिएंटेशन परिवर्तन के बाद।

निष्कर्ष में आपको AsyncTask के UIThread- लिंक्ड तरीकों का उपयोग नहीं करना चाहिए, जो इसका मुख्य लाभ है !!! इसके अलावा आप केवल DoInBackground पर गैर महत्वपूर्ण काम करना चाहिए। इस समस्या पर अधिक जानकारी के लिए यह धागा पढ़ें:

क्या AsyncTask वास्तव में वैचारिक रूप से त्रुटिपूर्ण है या मैं सिर्फ कुछ याद कर रहा हूं?

ऊपर दिए गए किसी भी समस्या जब मा आपके लिए एक चिंता का विषय है, AsyncTask के बजाय IntentServices, HandlerThread या ThreadPoolExecutor का उपयोग करने को प्राथमिकता देने का प्रयास करने के लिए। यकीन है कि इसे और अधिक काम करने की आवश्यकता होगी लेकिन आपका आवेदन सुरक्षित होगा।


हाँ, मैंने बहुत समय बिताया है जो कि AsyncTasks के कई उपयोगों पर पछतावा है। वे बहुत अच्छे लगते हैं, लेकिन ... इतनी सारी समस्याएं!
SMBiggs

6
मुझे आपके बिंदुओं के खिलाफ इतनी दृढ़ता से पोस्ट करने का खेद है, लेकिन मैं आपकी खराब शैली को एंड्रॉइड पर प्रभाव नहीं होने दे सकता। एक बिंदु। आपके पास नहीं होना चाहिए कि कई धागे चल रहे हैं। यदि आप इस पार आते हैं तो आपकी वास्तुकला फोबार है। बिंदु 2. पृथ्वी पर कैसे .. ठीक है, हाँ, एंड्रॉइड में सब कुछ कचरा कलेक्टर को मुफ्त गेम है ... आपको केवल ऊपर वर्णित के रूप में अपमानजनक व्यवहार दिखाई देगा, कुछ सख्ती से अपमानजनक मामलों में। बिंदु 3. अपने कार्य का प्रबंधन, असभ्य नहीं होना, एक नौसिखिया कौशल है। आप या तो इसे मारते हैं जब आप ऑनपॉज कहते हैं, या आप ठीक से अलग करते हैं और तदनुसार संलग्न करते हैं।
StarWind0

1
vogella.com/tutorials/AndroidBackgroundProcessing/article.html यह सब आपको ऊपर दिए गए मुद्दों के बिना ठीक से कार्य करने के लिए सीखने की आवश्यकता है (यह मानकर कि आप कुछ सौ कामों की तरह कुछ नहीं कर रहे हैं)
Starindind0

16

यदि आप हर एक्स सेकंड में एक गणना करना चाहते हैं, तो आपको संभवतः Runnableएक Handler(साथ postDelayed()) पर शेड्यूल Runnableकरना चाहिए और वर्तमान यूआई थ्रेड में शुरू करना चाहिए। यदि आप इसे किसी अन्य थ्रेड में प्रारंभ करना चाहते हैं, तो हैंडलरट्रेड का उपयोग करें। AsyncTask हमारे लिए उपयोग करना आसान है लेकिन हैंडलर से बेहतर नहीं है।


7

हैंडलर आवेदन के मुख्य धागे के साथ जुड़ा हुआ है। यह बैकग्राउंड थ्रेड्स से ऐप मेन थ्रेड पर भेजे गए संदेश और रनवेबल्स को हैंडल और शेड्यूल करता है।

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

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

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


3
आप अपना स्वयं का हैंडलर दूसरे थ्रेड से बना सकते हैं।
UVs Mjaliks

जरूरी नहीं कि हैंडलर मुख्य धागे (UI थ्रेड) से बंधा हो। यह उस थ्रेड से जुड़ा होता है जिसमें इसे इंस्टेंट किया गया था और मैसेज या रननेबल को हैंडल करता है जो इस थ्रेड मैसेज कतार में आता है। यह भी संदेश और Runnable ऑब्जेक्ट्स इस थ्रेड संदेश कतार के लिए भेज सकते हैं।
azec-pdx

2

AsyncTaskमान लें कि कुछ पृष्ठभूमि का काम समाप्त होने के बाद आप UI थ्रेड पर कुछ करेंगे। इसके अलावा, आप इसे केवल एक बार निष्पादित कर सकते हैं (इसके बाद, इसकी स्थिति है FINISHEDऔर आप इसे एक बार फिर निष्पादित करने के लिए एक अपवाद प्राप्त करेंगे)। साथ ही, इसका उपयोग करने का लचीलापन अधिक नहीं है। हां, आप THREAD_POOL_EXECUTORसमानांतर निष्पादन के लिए उपयोग कर सकते हैं , लेकिन प्रयास योग्य नहीं हो सकता है।

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

यहां विभिन्न प्रकार के Handlerउदाहरण देखें ।


0

वे सर्वश्रेष्ठ साक्षात्कार प्रश्न हैं जो पूछे जाते हैं। AsyncTask - इनका उपयोग UI थ्रेड को ऑफ़लोड करने और बैकग्राउंड में कार्य करने के लिए किया जाता है। हैंडलर - एंड्रॉइड डॉसेंट में यूआई और बैकग्राउंड थ्रेड के बीच संचार का सीधा तरीका है। संदेश पंक्ति के माध्यम से संदेश भेजने या चलाने के लिए हैंडलर का उपयोग किया जाना चाहिए।

इसलिए AsyncTasks का उपयोग किया जाता है जहां पृष्ठभूमि में निष्पादित होने के लिए कार्यों की आवश्यकता होती है और एक UI और पृष्ठभूमि थ्रेड के बीच संचार के लिए हैंडलर का उपयोग किया जाता है।


0

doInBackground - मूल रूप से दूसरे थ्रेड में काम करता है। onPostExecute - UI थ्रेड पर परिणाम पोस्ट करता है और यह आंतरिक रूप से मुख्य थ्रेड के हैंडलर को संदेश भेज रहा है। मुख्य यूआई थ्रेड में पहले से ही एक लूपर और हैंडलर जुड़ा हुआ है।

तो मूल रूप से, यदि आपको कुछ पृष्ठभूमि कार्य करना है, तो AsyncTask का उपयोग करें। लेकिन अंततः, अगर यूआई पर कुछ अपडेट करने की आवश्यकता होती है, तो यह मुख्य थ्रेड के हैंडलर का उपयोग करेगा।

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