पृष्ठभूमि में कुछ करना और फिर यूआई अपडेट करना एंड्रॉइड में सही ढंग से लागू करना बहुत मुश्किल है। यह बस बुरी तरह से डिजाइन किया गया है। विशिष्ट उदाहरण एक AsyncTask है जो वेब से कुछ प्राप्त करता है और परिणाम प्रदर्शित करता है। इसके साथ 2 समस्याएं हैं:क्या हनीकॉम लोडर AsyncTask + UI अद्यतन के साथ समस्याएं हल कर सकते हैं?
AsyncTask में गतिविधि का संदर्भ है (क्योंकि इसे इसके यूआई को अपडेट करने की आवश्यकता है)। स्क्रीन अभिविन्यास परिवर्तन के बाद, गतिविधि को पुनरारंभ किया जाता है। लेकिन AsyncTask अभी भी पुराने नष्ट गतिविधि का संदर्भ देता है इसलिए यह नई गतिविधि के यूआई को अपडेट नहीं कर सकता है।
इससे आउटऑफमेमरी अपवाद हो सकता है। कल्पना करें कि आपके पास बहुत सारी बिटमैप्स वाली गतिविधि है और कुछ AsyncTask शुरू करें। आप वापस दबाएं (गतिविधि समाप्त हो गई है) लेकिन AsyncTask अभी भी चल रहा है और क्योंकि यह गतिविधि के संदर्भ में है, बिटमैप्स के साथ गतिविधि अभी भी स्मृति में है। इसे दोहराएं (गतिविधि और बैक शुरू करें) और आपके पास जल्द या बाद में एक बल बंद है।
इसे हल किया जा सकता है, लेकिन यह बहुत जटिल है। एक गतिविधि में मेरे पास 3 अलग AsyncTasks हैं, उनमें से प्रत्येक एक साथ कई उदाहरणों में चल रहा है। इसे सही ढंग से कार्यान्वित करना निराशाजनक है। कोड समझने और डीबग करने के लिए वास्तव में मुश्किल हो जाता है।
Honeycomb Loaders किसी भी तरह से इसे हल कर सकते हैं? और क्या प्री-हनीकॉम एंड्रॉइड संस्करणों में उनका उपयोग करने का कोई तरीका है?
धन्यवाद, लेकिन उदाहरण में, केवल समस्या 1. हल हो गया है - AsyncTask में गतिविधि फ़ील्ड को Destroy() में हटा दिया जाना चाहिए। मैं समस्याओं को हल करने में मेरी सहायता के लिए AsyncTask और गतिविधि के अपने उप-वर्गों का उपयोग करता हूं 1. और 2. लेकिन यह अभी भी बहुत जटिल है। असीमित काम करना आसान होना चाहिए। – fhucho
समस्या 2 को भी हल किया गया है: हर बार जब कोई नई गतिविधि बनाई जाती है तो AsyncTask के अंदर एक संदर्भ अपडेट किया जाता है, ताकि यह इस नई गतिविधि को इंगित कर सके। तो पुरानी गतिविधि का संदर्भ कुछ भी नहीं है और इसे जीसीड किया जा सकता है। –
@ माइक: एक महान लिंक के लिए धन्यवाद! मैं इसे अपनी भविष्य की परियोजनाओं में उपयोग करूंगा। –