2011-01-28 16 views
43

मैं वर्तमान में एक टीम में कुछ एंड्रॉइड ऐप्स विकसित कर रहा हूं और हमने पिछले महीनों के दौरान 2 अलग-अलग दृष्टिकोणों का उपयोग किया है (एक जिसे मैं व्यक्तिगत रूप से पसंद करता हूं, और दूसरा जो अन्य डेवलपर पसंद करता है)। निजी वर्ग के रूप मेंएंड्रॉइड: AsyncTask सिफारिशें: निजी कक्षा या सार्वजनिक कक्षा?

  • उपयोग AsyncTasks क्रियाएँ कि उन्हें इस्तेमाल के अंदर:

    हालांकि अब तक के परिणाम एक ही हैं, यह मुझे सोच ... चाहिए हम मिल गया। अलग सार्वजनिक कक्षाएं कि गतिविधि

के संदर्भ प्राप्त करते हैं

  • या उपयोग AsyncTasks दृष्टिकोणों Google द्वारा अनुशंसित के किसी भी कर रहे हैं?

    इस अनुभव के बारे में आपका अनुभव क्या है (फायदे, नुकसान, समस्याएं)?

  • उत्तर

    35

    आंतरिक कक्षाएं उन वस्तुओं का प्रतिनिधित्व करने के लिए अच्छी हैं जो निजी होने या किसी भी तरह से संलग्न कक्षा से घनिष्ठ रूप से बंधी हुई हैं। कभी-कभी आंतरिक कक्षाओं का उपयोग करने के तकनीकी कारण होते हैं (उदाहरण के लिए, बंद सिमुलेटिंग)। उन्होंने नेमस्पेस प्रदूषण पर भी कटौती की।

    आंतरिक कक्षाओं का एक नुकसान यह है कि यदि वे संलग्न वर्ग के निजी सदस्यों (फ़ील्ड या फ़ंक्शंस) तक पहुंचते हैं, तो संकलक उन सदस्यों को एक्सेसर फ़ंक्शन उत्पन्न करेगा। भाषा शुद्धवादियों का तर्क होगा कि क्या यह encapsulation का तोड़ना एक अच्छी बात है या एक बुरी बात है। एक्सेस फ़ंक्शंस प्रत्येक एक्सेस में थोड़ा ओवरहेड जोड़ता है (जो आमतौर पर कारक नहीं होता है, लेकिन वहां होता है)। एक और नुकसान यह है कि यह स्रोत फ़ाइल को अधिक जटिल बनाता है और इसलिए प्रबंधन करना कठिन होता है। (मुझे कभी-कभी बाहरी वर्ग में एक समारोह को संपादित करके चुराया गया है, जबकि यह सोचता है कि यह बाहरी वर्ग में था, और इसके विपरीत।) अंत में, आंतरिक कक्षाएं पुन: प्रयोज्य नहीं होती हैं, जबकि अलग-अलग वर्गों को अक्सर एकाधिक उपयोग करने के लिए पैरामीटर किया जा सकता है ।

    ये पेशेवर और विपक्ष मेरे सिर के ऊपर से हैं। मुझे यकीन है कि दूसरों के पास अतिरिक्त विचार होंगे।

    अद्यतन:

    इस गूगल आईओ video भीतरी AsyncTask विकल्प स्पष्ट रूप से गलत रूप में विकल्प के रूप में चिह्नित किया जाता है।

    +1

    अलग-अलग सार्वजनिक वर्गों के रूप में उनका उपयोग करते समय मुझे लगता है कि यह अधिक उपयोगी है। – neteinstein

    +14

    @NeTeInStEiN - एक AsyncTask के लिए, एक आंतरिक वर्ग (एक नेस्टेड स्थैतिक वर्ग की तुलना में) तकनीकी कारणों से हमेशा गलत होता है: AsyncTask को रोकने के बिना एक गतिविधि को मार दिया जा सकता है (कॉन्फ़िगरेशन परिवर्तन कहने के कारण)। यदि AsyncTask एक आंतरिक वर्ग था, तो यह पुरानी गतिविधि को रिसाव करेगा क्योंकि AsyncTask में बाहरी वर्ग के उदाहरण के लिए एक (छुपा) संदर्भ होगा। फोन के कुछ अभिविन्यास परिवर्तन तब प्रक्रिया को स्मृति थकावट से मरने का कारण बनेंगे। –

    7

    इससे कोई फर्क नहीं पड़ता, जो आपके कोड के लिए सबसे अधिक समझ में आता है। महत्वपूर्ण बात यह है कि एक एसिंक कार्य को देखना है जो गतिविधि को नष्ट करने के बाद किसी गतिविधि पर संदर्भ धारण कर रहा है, या तो गतिविधि के आंतरिक वर्ग के रूप में, या स्पष्ट रूप से गतिविधि/संदर्भ वस्तु को दिया जा रहा है।

    +4

    एक गतिविधि के संदर्भ में AsyncTask की (बहुत आम) समस्या के समाधान के लिए [इस चर्चा] [https://groups.google.com/forum/#!starred/android-developers/vwRrlc84gy0) देखें। –

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