मैं उलझन में हूँ कि जब कोई एक हैंडलर के ऊपर AsyncTask का चयन करेगा। कहो मेरे पास कुछ कोड हैं जो मैं हर एन सेकंड चलाना चाहता हूं जो यूआई को अपडेट करेगा। मैं एक को दूसरे पर क्यों चुनूंगा?
मैं उलझन में हूँ कि जब कोई एक हैंडलर के ऊपर AsyncTask का चयन करेगा। कहो मेरे पास कुछ कोड हैं जो मैं हर एन सेकंड चलाना चाहता हूं जो यूआई को अपडेट करेगा। मैं एक को दूसरे पर क्यों चुनूंगा?
जवाबों:
IMO, AsyncTask को निम्न-स्तरीय विवरणों (थ्रेड्स, मैसेज लूप्स इत्यादि) के बारे में बहुत अधिक चिंता किए बिना, एंड्रॉइड ऐप्स में पृष्ठभूमि प्रसंस्करण को प्राप्त करने के लिए एक सुविधाजनक, आसान उपयोग प्रदान करने के लिए लिखा गया था। यह कॉलबैक तरीके प्रदान करता है जो कार्यों को शेड्यूल करने में मदद करता है और आवश्यकता पड़ने पर आसानी से यूआई को अपडेट करने के लिए भी।
हालांकि, यह ध्यान रखना महत्वपूर्ण है कि AsyncTask का उपयोग करते समय, एक डेवलपर अपनी सीमाओं के लिए प्रस्तुत कर रहा है, जिसके परिणामस्वरूप वर्ग के लेखक ने डिजाइन निर्णयों के कारण। उदाहरण के लिए, मुझे हाल ही में पता चला है कि उन नौकरियों की संख्या की सीमा है जो AsyncTasks का उपयोग करके निर्धारित की जा सकती हैं।
हैंडलर दोनों का अधिक पारदर्शी है और शायद आपको अधिक स्वतंत्रता देता है; इसलिए यदि आप चीजों पर अधिक नियंत्रण चाहते हैं तो आप हैंडलर का चयन करेंगे अन्यथा असिनटस्क ठीक काम करेगा।
AsyncTasksएक धागे पर निष्पादित किया जाता है, इसलिए अब कोई समानता नहीं है। आप अभी भी उन्हें एक पार्सल Executorकार्यान्वयन पर चला सकते हैं ।
अंगूठे का मेरा नियम होगा:
यदि आप UI से संबंधित कुछ अलग कर रहे हैं, उदाहरण के लिए किसी सूची में प्रस्तुत करने के लिए डेटा डाउनलोड करना, आगे बढ़ें और उपयोग करें AsyncTask।
यदि आप कई बार दोहराए जाने वाले कार्य कर रहे हैं, उदाहरण के लिए, कई छवियों को डाउनलोड करने के लिए जिन्हें डाउनलोड करने पर ImageViews(जैसे थंबनेल डाउनलोड करने में) प्रदर्शित किया जाना है , के साथ एक कार्य कतार का उपयोग करें Handler।
मुख्य रूप से निम्नलिखित कारणों से जब संभव हो तो हमेशा AsyncTask का उपयोग करने से बचने की कोशिश करें:
AsyncTask को चलाने की गारंटी नहीं है क्योंकि सिस्टम द्वारा थ्रेडपूल बेस और अधिकतम आकार निर्धारित है और यदि आप बहुत अधिक एसिंक्टस्क बनाते हैं तो वे अंततः नष्ट हो जाएंगे।
गतिविधि जीवनचक्र पर निर्भर करते हुए, चलने पर भी, AsyncTask को स्वचालित रूप से समाप्त किया जा सकता है
UI थ्रेड पर चल रहे AsyncTask तरीके, onPostExecute की तरह निष्पादित किए जा सकते हैं, जब यह जिस गतिविधि का उल्लेख कर रहा है, वह अब दिखाई नहीं दे रही है, या संभवतः एक अलग लेआउट स्थिति में है, जैसे ओरिएंटेशन परिवर्तन के बाद।
निष्कर्ष में आपको AsyncTask के UIThread- लिंक्ड तरीकों का उपयोग नहीं करना चाहिए, जो इसका मुख्य लाभ है !!! इसके अलावा आप केवल DoInBackground पर गैर महत्वपूर्ण काम करना चाहिए। इस समस्या पर अधिक जानकारी के लिए यह धागा पढ़ें:
क्या AsyncTask वास्तव में वैचारिक रूप से त्रुटिपूर्ण है या मैं सिर्फ कुछ याद कर रहा हूं?
ऊपर दिए गए किसी भी समस्या जब मा आपके लिए एक चिंता का विषय है, AsyncTask के बजाय IntentServices, HandlerThread या ThreadPoolExecutor का उपयोग करने को प्राथमिकता देने का प्रयास करने के लिए। यकीन है कि इसे और अधिक काम करने की आवश्यकता होगी लेकिन आपका आवेदन सुरक्षित होगा।
यदि आप हर एक्स सेकंड में एक गणना करना चाहते हैं, तो आपको संभवतः Runnableएक Handler(साथ postDelayed()) पर शेड्यूल Runnableकरना चाहिए और वर्तमान यूआई थ्रेड में शुरू करना चाहिए। यदि आप इसे किसी अन्य थ्रेड में प्रारंभ करना चाहते हैं, तो हैंडलरट्रेड का उपयोग करें। AsyncTask हमारे लिए उपयोग करना आसान है लेकिन हैंडलर से बेहतर नहीं है।
हैंडलर आवेदन के मुख्य धागे के साथ जुड़ा हुआ है। यह बैकग्राउंड थ्रेड्स से ऐप मेन थ्रेड पर भेजे गए संदेश और रनवेबल्स को हैंडल और शेड्यूल करता है।
AsyncTask यूआई को अपडेट करने के लिए बैकग्राउंड थ्रेड्स को संभालने के लिए एक सरल विधि प्रदान करता है ताकि समय लेने वाले ऑपरेशनों को अवरुद्ध किए बिना यूआई को अपडेट किया जा सके।
इसका उत्तर यह है कि दोनों का उपयोग पृष्ठभूमि थ्रेड्स से UI को अपडेट करने के लिए किया जा सकता है, अंतर आपके निष्पादन परिदृश्य में होगा। आप हैंडलर का उपयोग करने पर विचार कर सकते हैं जिसे आप विलंबित संदेशों को पोस्ट करना चाहते हैं या किसी विशिष्ट क्रम में MessageQueue को संदेश भेजना चाहते हैं।
आप AsyncTask का उपयोग करने पर विचार कर सकते हैं यदि आप एप्लिकेशन (इस प्रकार यूआई को अपडेट करना) ऐप को मुख्य थ्रेड और बैकग्राउंड थ्रेड के बीच आसान तरीके से विनिमय करना चाहते हैं।
AsyncTaskमान लें कि कुछ पृष्ठभूमि का काम समाप्त होने के बाद आप UI थ्रेड पर कुछ करेंगे। इसके अलावा, आप इसे केवल एक बार निष्पादित कर सकते हैं (इसके बाद, इसकी स्थिति है FINISHEDऔर आप इसे एक बार फिर निष्पादित करने के लिए एक अपवाद प्राप्त करेंगे)। साथ ही, इसका उपयोग करने का लचीलापन अधिक नहीं है। हां, आप THREAD_POOL_EXECUTORसमानांतर निष्पादन के लिए उपयोग कर सकते हैं , लेकिन प्रयास योग्य नहीं हो सकता है।
HandlerRunnables और संदेशों को संभालने के अलावा, कुछ भी निर्धारित नहीं करता है। साथ ही, इसे जितनी बार चाहें उतनी बार चलाया जा सकता है । आप यह तय करने के लिए स्वतंत्र हैं कि इसे किस थ्रेड से जोड़ा जाना चाहिए, यह अन्य हैंडलर के साथ कैसे संवाद करता है, शायद उनके साथ उत्पादन करता है HandlerThread। तो, यह बहुत अधिक लचीला है और कुछ दोहराया काम के लिए उपयुक्त है।
यहां विभिन्न प्रकार के Handlerउदाहरण देखें ।
वे सर्वश्रेष्ठ साक्षात्कार प्रश्न हैं जो पूछे जाते हैं। AsyncTask - इनका उपयोग UI थ्रेड को ऑफ़लोड करने और बैकग्राउंड में कार्य करने के लिए किया जाता है। हैंडलर - एंड्रॉइड डॉसेंट में यूआई और बैकग्राउंड थ्रेड के बीच संचार का सीधा तरीका है। संदेश पंक्ति के माध्यम से संदेश भेजने या चलाने के लिए हैंडलर का उपयोग किया जाना चाहिए।
इसलिए AsyncTasks का उपयोग किया जाता है जहां पृष्ठभूमि में निष्पादित होने के लिए कार्यों की आवश्यकता होती है और एक UI और पृष्ठभूमि थ्रेड के बीच संचार के लिए हैंडलर का उपयोग किया जाता है।
doInBackground - मूल रूप से दूसरे थ्रेड में काम करता है। onPostExecute - UI थ्रेड पर परिणाम पोस्ट करता है और यह आंतरिक रूप से मुख्य थ्रेड के हैंडलर को संदेश भेज रहा है। मुख्य यूआई थ्रेड में पहले से ही एक लूपर और हैंडलर जुड़ा हुआ है।
तो मूल रूप से, यदि आपको कुछ पृष्ठभूमि कार्य करना है, तो AsyncTask का उपयोग करें। लेकिन अंततः, अगर यूआई पर कुछ अपडेट करने की आवश्यकता होती है, तो यह मुख्य थ्रेड के हैंडलर का उपयोग करेगा।