2010-05-26 12 views
21

क्या कन्स्ट्रक्चर को संदर्भ में पास करने और आंतरिक उपयोग के लिए इसे एक निजी चर के रूप में सहेजना बुरा व्यवहार है? दूसरा विकल्प कॉन्टेक्स्ट को उन विधियों के पैरामीटर के रूप में पास करना है जिनकी आवश्यकता है।आंतरिक रूप से उपयोग करने के लिए रचनाकारों को गतिविधि गतिविधि पास करना - क्या यह खराब

कौन सा बेहतर विकल्प है? मुझे एहसास है कि कन्स्ट्रक्टर को गुजरने से स्मृति में गलती हो सकती है।

+0

इसे लाने के लिए भी धन्यवाद! मैंने वास्तव में मेमोरी लीक – HXCaine

उत्तर

11

अक्सर, आपकोकी आवश्यकता है, तो आप केवल this के बजाय this.getApplicationContext() पास कर सकते हैं। ऐप के जीवनकाल के लिए आपका ऐप संदर्भ मौजूद है, इसलिए यह स्मृति रिसाव नहीं है।

+0

दरअसल आम तौर पर मैं जो करना चाहता हूं वह है GetResources() का उपयोग करें, तो यह मेरे मामले में सही काम करेगा? – jax

+0

निश्चित रूप से, अगर आपको बस इतना ही चाहिए। – JRL

+7

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

9

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

यदि किसी ऑब्जेक्ट में संदर्भ का संदर्भ है यह गतिविधि को कचरा इकट्ठा करने से रोक देगा, और चूंकि एक गतिविधि के सभी विचारों के संदर्भ में इसका अर्थ है, इसका मतलब है कि आप आसानी से बहुत सारी मेमोरी लीक कर सकते हैं।

डिवाइस रोटेशन जैसी चीजें फिर से बनाई जाने वाली चीज़ों के कारण स्वयं को पकड़ना आसान है और बिना किसी उद्देश्य के ऑब्जेक्ट पर लटका आसान है।

तो शायद सुरक्षित पक्ष पर होना संभव है और जब आपको इसकी आवश्यकता हो तो संदर्भ में पास होना सबसे अच्छा है।

+5

पर विचार किए बिना किया है यह केवल तभी सही है जब आपके संदर्भ का संदर्भ देने वाला ऑब्जेक्ट स्थिर रूप से या कम से कम किसी ऑब्जेक्ट द्वारा किया जाता है जो गतिविधि को पार करता है। –

1

मुख्य एप्लिकेशन (जो लॉन्च) में, एक परिवर्तनीय ऐपकॉन्टेक्स्ट घोषित करें: "सार्वजनिक स्थैतिक संदर्भ ऐपकोन्टेक्स्ट;" फिर, इस मुख्य एप्लिकेशन के लिए ऑनक्रेट() विधि में, असाइन करें: "appContext = this;" क्योंकि ऐपकॉन्टेक्स्ट सार्वजनिक है, इस पैकेज में कोई अन्य वर्ग एक्सएम संसाधनों को ट्रैक करने के लिए ऐपकॉन्टेक्स्ट का उपयोग कर सकती है। क्या यह कोई बेहतर है (स्मृति दृष्टिकोण से)?

संसाधन ऑब्जेक्ट को मुख्य अनुप्रयोग में सार्वजनिक स्थैतिक के रूप में घोषित करना और फिर कहीं और इसका उपयोग करना संभव है, क्योंकि संसाधनों की आपको आवश्यकता है।

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