2012-11-08 12 views
13

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

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

+2

क्या यह उपयोगिता वर्ग या कुछ में हो रहा है? आपको 'getString()' के संदर्भ की आवश्यकता है, इसलिए संक्षिप्त उत्तर हाँ है। यदि आप इसे कहां/कहां कॉल करने की आवश्यकता है, इस बारे में अधिक जानकारी प्रदान करते हैं, तो विधि पैरामीटर पास करने/पकड़े जाने से * बेहतर तरीका * हो सकता है। –

उत्तर

7

नहीं, आपको यह नहीं करना चाहिए। एक साधारण नियम है; यदि यूआई को छूने के लिए आपको संदर्भ की आवश्यकता है या केवल गतिविधि वर्ग के आंतरिक से जुड़ा हुआ है, तो आपको गतिविधि संदर्भ का उपयोग करना चाहिए। फिर भी, यह महत्वपूर्ण है कि संदर्भ के किसी भी संदर्भ में जीवन भर नहीं है जो गतिविधि की तुलना में अधिक है।

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

तो, यह संदर्भ किसी ऐसी चीज़ के लिए जरूरी है जो यूआई से संबंधित नहीं है, जैसे स्ट्रिंग संसाधन प्राप्त करने की आपकी आवश्यकता, फिर अनुप्रयोग संदर्भ का उपयोग करें। एक गतिविधि के अंदर, और जहां गतिविधि में स्ट्रिंग संदर्भ घोषित किया गया है, तो गतिविधि संदर्भ का उपयोग स्वीकार्य होगा और मेरी राय में, जैसा कि आप दायरे और जीवनकाल के बारे में एक सचेत निर्णय ले रहे हैं।

उस ने कहा, आपको यह पूछना चाहिए कि क्या इस विशेष विधि को गतिविधि में बेहतर रखा गया है या नहीं। यह ठीक नहीं हो सकता है लेकिन खुद से पूछो।

अंत में, एक छोटा सा pedantic बिंदु। आप वस्तुओं को कहीं भी पास नहीं करते हैं। आप एक संदर्भ पारित करते हैं, वास्तव में वस्तु के संदर्भ का एक मूल्य। जावा में सबकुछ मूल्य से गुजरता है।

+1

मुझे यूआई से संबंधित कार्यों के लिए कॉन्टेक्स्ट ऑब्जेक्ट की आवश्यकता नहीं है, केवल getString के लिए, इसलिए राज्य वर्ग की तरह कुछ के माध्यम से एप्लिकेशन उपलब्ध कराने के बजाय यह तरीका है। विश्व स्तर पर उपलब्ध राज्य (यानी सिंगलेट्स) के लिए सभी नफरत सिर्फ मुझे एक बदसूरत दिशा में इंगित करती हैं - संदर्भों के चारों ओर गुजरती हैं। और हाँ, मुझे पता है कि जावा में आप उन्हें गहरी प्रतिलिपि बनाने के बजाय ऑब्जेक्ट्स के संदर्भों की प्रतियों को पार करते हैं। – dodehoekspiegel

+1

बस getAplicationContext() का उपयोग करें, इसे एप्लिकेशन संदर्भ पर एक महान चर्चा के लिए देखें। http://stackoverflow.com/questions/5018545/getapplication-vs-getapplicationcontext बीटीडब्ल्यू, आपका आवेदन एक सिंगलटन है, इसलिए नफरत करने वाले सभी को नफरत है, लेकिन वे जो कुछ भी करते हैं वह सिंगलेट्स पर निर्भर करता है :) हां, इसका दुरुपयोग करने के कई तरीके हैं लेकिन आवेदन संदर्भ का उपयोग करना उनमें से एक नहीं है और चूंकि यह एक सिंगलटन है, इसलिए राज्य इसमें नहीं आता है। आपका आवेदन उदाहरण राज्य है। – Simon

0

आप हमेशा आवेदन कक्षा का विस्तार कर सकते हैं। संदर्भ प्राप्त करने के लिए getInstace() के लिए वहां एक स्थिर विधि बनाएं।

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

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