software - android system download




हैंडलर बनाम AsyncTask (6)

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


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

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

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


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

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

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


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


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

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


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

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

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


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

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





android