2011-02-23 10 views
13

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

  1. AsyncTask में गतिविधि का संदर्भ है (क्योंकि इसे इसके यूआई को अपडेट करने की आवश्यकता है)। स्क्रीन अभिविन्यास परिवर्तन के बाद, गतिविधि को पुनरारंभ किया जाता है। लेकिन AsyncTask अभी भी पुराने नष्ट गतिविधि का संदर्भ देता है इसलिए यह नई गतिविधि के यूआई को अपडेट नहीं कर सकता है।

  2. इससे आउटऑफमेमरी अपवाद हो सकता है। कल्पना करें कि आपके पास बहुत सारी बिटमैप्स वाली गतिविधि है और कुछ AsyncTask शुरू करें। आप वापस दबाएं (गतिविधि समाप्त हो गई है) लेकिन AsyncTask अभी भी चल रहा है और क्योंकि यह गतिविधि के संदर्भ में है, बिटमैप्स के साथ गतिविधि अभी भी स्मृति में है। इसे दोहराएं (गतिविधि और बैक शुरू करें) और आपके पास जल्द या बाद में एक बल बंद है।

इसे हल किया जा सकता है, लेकिन यह बहुत जटिल है। एक गतिविधि में मेरे पास 3 अलग AsyncTasks हैं, उनमें से प्रत्येक एक साथ कई उदाहरणों में चल रहा है। इसे सही ढंग से कार्यान्वित करना निराशाजनक है। कोड समझने और डीबग करने के लिए वास्तव में मुश्किल हो जाता है।

Honeycomb Loaders किसी भी तरह से इसे हल कर सकते हैं? और क्या प्री-हनीकॉम एंड्रॉइड संस्करणों में उनका उपयोग करने का कोई तरीका है?

उत्तर

7

हां, Loader के साथ मेरे अनुभव से वे AsyncTasks और कॉन्फ़िगरेशन परिवर्तनों के साथ लोगों की सामान्य समस्याओं को हल करने लगते हैं।

मुझे लगता है कि Google ने कहा कि टुकड़े स्थिर पुस्तकालय में Loaders भी शामिल होगा, इसलिए हाँ, लाइब्रेरी जारी होने पर उन्हें पीछे की तरफ काम करना चाहिए।

4

यह हनीकॉम लोडर के बारे में आपके प्रश्न का उत्तर नहीं देता है लेकिन निम्न लिंक में एक पैटर्न है जो आसानी से AsyncTasks के लिए अभिविन्यास परिवर्तनों को नियंत्रित करता है।

http://evancharlton.com/thoughts/rotating-async-tasks/

रूप में अच्छी तरह से वहाँ पर कुछ अन्य महान पदों Theres।

अद्यतन: जैसा ओपी टिप्पणियों में नोट किया गया है, यह केवल कॉन्फ़िगरेशन (अभिविन्यास) परिवर्तनों के लिए काम करता है, लेकिन बैक बटन का उपयोग करते समय काम नहीं करता है और होम मेनू या कार्य सूची के माध्यम से पुनरारंभ होता है।

यदि आपको एक समय में एक AsyncTask की आवश्यकता है, तो आप गतिविधि के अंदर AsyncTask के स्थिर संदर्भ का उपयोग कर सकते हैं। दूसरा विकल्प एप्लिकेशन के संदर्भ को सहेजना होगा।

फिर जब कोई नई गतिविधि शुरू होती है, तो आप देखते हैं कि एक AsyncTask चल रहा है या खुद को वर्तमान गतिविधि (AsyncTask पर एक सेटटर के माध्यम से) के रूप में सेट करें। AsyncTask के अंदर गतिविधि तक पहुंच को सिंक्रनाइज़ करना सुनिश्चित करें।

+0

धन्यवाद, लेकिन उदाहरण में, केवल समस्या 1. हल हो गया है - AsyncTask में गतिविधि फ़ील्ड को Destroy() में हटा दिया जाना चाहिए। मैं समस्याओं को हल करने में मेरी सहायता के लिए AsyncTask और गतिविधि के अपने उप-वर्गों का उपयोग करता हूं 1. और 2. लेकिन यह अभी भी बहुत जटिल है। असीमित काम करना आसान होना चाहिए। – fhucho

+0

समस्या 2 को भी हल किया गया है: हर बार जब कोई नई गतिविधि बनाई जाती है तो AsyncTask के अंदर एक संदर्भ अपडेट किया जाता है, ताकि यह इस नई गतिविधि को इंगित कर सके। तो पुरानी गतिविधि का संदर्भ कुछ भी नहीं है और इसे जीसीड किया जा सकता है। –

+0

@ माइक: एक महान लिंक के लिए धन्यवाद! मैं इसे अपनी भविष्य की परियोजनाओं में उपयोग करूंगा। –

संबंधित मुद्दे