यह एक बहुत अच्छा सवाल है, इस मुद्दे को पूरी तरह से समझने के लिए एंड्रॉइड प्रोग्रामर के रूप में समय लगता है। वास्तव में AsyncTask के दो मुख्य मुद्दे हैं जो संबंधित हैं:
- वे खराब रूप से गतिविधि जीवन चक्र से बंधे हैं
- वे बहुत आसानी से मेमोरी लीक बनाते हैं।
अंदर RoboSpice (मंशा एप्लिकेशन Google Play पर उपलब्ध ) हम विस्तार से इस सवाल का जवाब। यह AsyncTasks, लोडर, उनकी विशेषताओं और कमियों के बारे में गहराई से विचार देगा और आपको नेटवर्क अनुरोधों के लिए एक वैकल्पिक समाधान भी पेश करेगा: रोबोस्पाइस। नेटवर्क अनुरोध एंड्रॉइड में एक सामान्य आवश्यकता है और प्रकृति लंबे समय तक चलने वाले संचालन द्वारा हैं। यहाँ एप्लिकेशन से एक अंश है:
AsyncTask और गतिविधि जीवन चक्र
AsyncTasks गतिविधि इंस्टेंस के जीवन चक्र का पालन नहीं करते हैं। यदि आप किसी गतिविधि के अंदर एक AsyncTask शुरू करते हैं और आप डिवाइस को घुमाते हैं, तो गतिविधि नष्ट हो जाएगी और एक नया उदाहरण बन जाएगा। लेकिन AsyncTask नहीं मरेगा। यह पूरा होने तक जीवित रहेगा।
और जब यह पूरा हो जाता है, तो AsyncTask नई गतिविधि के UI को अपडेट नहीं करेगा। वास्तव में यह उस गतिविधि के पूर्व उदाहरण को अपडेट करता है जो अब प्रदर्शित नहीं होता है। यह java.lang.IllegalArgumentException के प्रकार का अपवाद हो सकता है: यदि आप उपयोग करते हैं, तो विंडो प्रबंधक से संलग्न नहीं देखें, उदाहरण के लिए, गतिविधि के अंदर एक दृश्य पुनः प्राप्त करने के लिए FindById।
स्मृति रिसाव मुद्दा
आपकी गतिविधियों के आंतरिक वर्गों के रूप में AsyncTasks बनाना बहुत सुविधाजनक है। जैसा कि AsyncTask को कार्य पूरा होने या प्रगति पर होने पर गतिविधि के विचारों में हेरफेर करने की आवश्यकता होगी, गतिविधि के एक आंतरिक वर्ग का उपयोग सुविधाजनक लगता है: आंतरिक वर्ग बाहरी वर्ग के किसी भी क्षेत्र तक सीधे पहुंच सकते हैं।
फिर भी, इसका मतलब है कि आंतरिक वर्ग अपने बाहरी वर्ग उदाहरण पर एक अदृश्य संदर्भ रखेगा: गतिविधि।
लंबे समय तक, यह एक मेमोरी रिसाव पैदा करता है: यदि एस्किंटस्क लंबे समय तक रहता है, तो यह गतिविधि को "जीवित" रखता है, जबकि एंड्रॉइड इससे छुटकारा पाना चाहेगा क्योंकि यह अब प्रदर्शित नहीं किया जा सकता है। गतिविधि को एकत्र नहीं किया जा सकता है और यह डिवाइस पर संसाधनों को संरक्षित करने के लिए एंड्रॉइड के लिए एक केंद्रीय तंत्र है।
लंबे समय तक चलने वाले कार्यों के लिए AsyncTasks का उपयोग करना वास्तव में बहुत बुरा विचार है। फिर भी, वे छोटे जीवित लोगों के लिए ठीक हैं जैसे कि 1 या 2 सेकंड के बाद व्यू अपडेट करना।
मैं आपको रोबोस्पाइस मोटिवेशन ऐप डाउनलोड करने के लिए प्रोत्साहित करता हूं , यह वास्तव में इसे गहराई से समझाता है और कुछ पृष्ठभूमि संचालन करने के लिए विभिन्न तरीकों के नमूने और प्रदर्शन प्रदान करता है।
doInBackground
फंक्शन स्क्रीन को फ्रीज कर देता है अगर प्रगति पट्टी का उपयोग नहीं किया जाता है।