2011-12-27 16 views
5

मेरे पास एक प्रोजेक्ट है (एक्लिप्स में) जिसे मैंने एंड्रॉइड प्रोजेक्ट लाइब्रेरी में बदल दिया है ताकि किसी अन्य प्रोजेक्ट में कोड का दोबारा उपयोग किया जा सके। मुझे लगता है कि मैं अपने आप को पैर में गोली मार दी किया है लेकिन जैसा कि मैंने त्रुटि हो रही है:एंड्रॉइड प्रोजेक्ट लाइब्रेरी में क्लास विस्तारित एप्लिकेशन?

Unable to start activity ComponentInfo{com.test.scroller1/com.lib.scrolltest.ScrollTestActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to com.lib.scrolltest.resAppVars 

com.lib.scrolltest मेरी परियोजना लाइब्रेरी जो एक वर्ग का विस्तार आवेदन (resAppVars) को दर्शाता है है। विधि OnCreate() में मैं फोन:

mRav = (resAppVars) getApplicationContext(); 

इस तरह, मैं इस तरह के एक सामान्य चयन बयान के एक प्रश्न गुजर के रूप में mRav वस्तु में तरीकों जो अन्यथा अन्य वर्गों में डुप्लिकेट किए गए कोड का एक बहुत कुछ होगा (उपयोग कर सकते हैं जो परिणामों के एक ArrayList देता है)।

यहां समस्या क्या है? ऐसा लगता है कि मैंने आवेदन कक्षा को लागू करने के तरीके में एक सीमा को मारा है।

उत्तर

4

कॉलिंग getAplicationContext() वर्तमान एप्लिकेशन के लिए Application ऑब्जेक्ट देता है (यानी उस एप्लिकेशन का स्वामित्व है जो onCreate() के अंदर चल रहा है)।

जब तक आप कुछ अजीब नहीं कर रहे हैं, तो आपको यह चुनने की ज़रूरत नहीं है कि Application कक्षा का उपयोग किया जाता है।

There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a Context which internally uses Context.getApplicationContext() when first constructing the singleton.

आप बस अपनी लाइब्रेरी प्रोजेक्ट के अंदर एक नियमित रूप से साझा वर्ग बनाना चाहिए: वहाँ Application के लिए दस्तावेज में भी एक नोट यह करने के लिए नहीं कह रहा है। या यदि आपको विशेष कार्यक्षमता लाइब्रेरी प्रोजेक्ट ऑफ़र की आवश्यकता नहीं है, तो आप नियमित रूप से नियमित .jar फ़ाइल का भी उपयोग कर सकते हैं।

और यदि आपको साझा स्थिति की आवश्यकता है, तो बस इसे सिंगलटन बनाएं। ;)

+0

धन्यवाद लेकिन स्थिर चर (सिंगलेट्स) एंड्रॉइड में सबसे अच्छा तरीका नहीं है। आवेदन जीवन चक्र के कुछ उदाहरणों में स्टेटिक वर्र्स को डिफ़ॉल्ट मानों में प्रारंभ किया जा सकता है। http://stackoverflow.com/questions/2475978/using-static-variables-in-android http://electronicvendor.com/using-static-variables-in-android/ मैं आपको जवाब देने के लिए समय लेने की सराहना करता हूं। – wufoo

+1

जहां तक ​​मुझे पता है, आपके ऐप की प्रक्रिया के जीवनकाल के लिए एक सिंगलटन मौजूद होगा। प्रक्रिया आपके ऐप के भीतर कम से कम किसी भी गैर-नष्ट घटक (गतिविधि, सेवा, आदि) के रूप में लंबे समय तक रहता है। –

+0

@ वाफू मैं अभी भी समझ में नहीं आता क्यों स्थिर सिंगलेट खराब हैं। मेरा मतलब है, एंड्रॉइड प्रलेखन स्वयं अनुप्रयोग वर्ग को वर्गीकृत करने के बजाय उनका उपयोग करने के लिए कहता है। यह इतना बुरा कैसे हो सकता है ?? –

3

हालांकि यह एक बहुत पुरानी पोस्ट है। मुझे एक ही समस्या का सामना करना पड़ा और इसे हल किया। तो मैंने सोचा कि मैं हर किसी के लिए समाधान पोस्ट करूंगा।

यह पता चला है कि मैं मैनिफेस्ट फ़ाइल में उप-वर्गीकृत एप्लिकेशन नाम घोषित करना भूल गया था। android:name को विस्तारित ऐप क्लास को इंगित करना चाहिए, भले ही इसे संदर्भित लाइब्रेरी में परिभाषित किया गया हो।

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="com.example.lib.MyApp"> 

के बाद मुझे लगता है कि मैं अपने प्रोजेक्ट में कहीं भी (<cast>) getApplication() साथ विस्तारित एप्लिकेशन इस्तेमाल कर सकते हैं जोड़ा।

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