android software हैंडलर बनाम AsyncTask




android system download (7)

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

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

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

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


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


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

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


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

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

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


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

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

  • गतिविधि जीवन चक्र के आधार पर, चलने के बावजूद AsyncTask स्वचालित रूप से समाप्त हो सकता है और आपके पास इसका कोई नियंत्रण नहीं है

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

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

AsyncTask वास्तव में अवधारणात्मक रूप से त्रुटिपूर्ण है या मैं बस कुछ याद कर रहा हूँ?

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


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

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

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


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

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





android