2012-01-16 17 views
5

क्या यह एंड्रॉइड AsyncTask के लिए सुरक्षित है जो गतिविधि के निजी सदस्य फ़ील्ड को AsyncTask.doInBackground() में पढ़ने के लिए गतिविधि की आंतरिक कक्षा है? अग्रिम में धन्यवाद।बाहरी गतिविधि वर्ग निजी सदस्य फ़ील्ड तक पहुंचने के लिए आंतरिक AsyncTask के लिए सुरक्षित?

+0

बहुत सामान्य प्रश्न, निजी सदस्य फ़ील्ड फ़ाइनल है? – Scorpion

उत्तर

8

आम तौर पर, नहीं। यदि गतिविधि कॉन्फ़िगरेशन परिवर्तन से गुजर रही है और इसे नष्ट कर दिया गया है और फिर से बनाया गया है, तो आपका पृष्ठभूमि थ्रेड गलत उदाहरण से बात करेगा, जो आपके लिए समस्याएं पैदा कर सकता है।

आदर्श रूप से, AsyncTask के doInBackground() अपने लॉन्चिंग घटक (गतिविधि, सेवा इत्यादि) से स्वतंत्र रूप से चलाने में सक्षम होना चाहिए। मेरा सुझाव है कि आप अपने AsyncTask पर एक कन्स्ट्रक्टर बनाएं और जो भी आवश्यक हो उसे पास करें। या, AsyncTask को setRetainInstance() का उपयोग करने वाले गतिशील खंड द्वारा प्रबंधित किया जाना चाहिए, जिस स्थिति में (AFAIK) खंड के निजी डेटा सदस्यों तक पहुंचने के लिए यह सुरक्षित होना चाहिए, क्योंकि टुकड़ा कहीं भी नहीं जा रहा है।

+0

बहुत अच्छा मुद्दा, जिसने मुझे सोचा (और शायद मेरी परियोजनाओं में कुछ रिफैक्टरिंग का कारण बन जाएगा ...) – Guillaume

+0

@ कॉमन्सवेयर इसलिए यह समस्याएं पैदा कर सकता है, लेकिन ये थ्रेडिंग के कारण नहीं हैं, विशेष रूप से स्मृति स्थिरता त्रुटियां। क्या वह सही है? –

+0

@ जुलिएयन: ठीक है, स्मृति स्थिरता त्रुटियां * थ्रेडिंग के कारण * हैं। – CommonsWare

0

जब एक आंतरिक कक्षाएं संलग्न वर्ग के निजी सदस्यों (फ़ील्ड या फ़ंक्शंस) तक पहुंचती हैं, तो संकलक उन सदस्यों को एक्सेसर फ़ंक्शन उत्पन्न करेगा। यह encapsulation तोड़ने जाएगा, कुछ तर्क देते हैं कि यह एक अच्छी बात है या एक बुरा बात है।

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