2010-12-10 12 views
17

मेरे पास एक कक्षा है जिसे इसके आवेदन के AssetManager का संदर्भ प्राप्त करने की आवश्यकता है। यह कक्षा किसी भी प्रकार की एंड्रॉइड यूआई कक्षा का विस्तार नहीं करती है, इसलिए इसमें getContext() विधि या कुछ भी समान नहीं है। क्या कुछ प्रकार की स्थैतिक Context.getCurrentApplicationContext() विधि का प्रकार है?संदर्भ के संदर्भ में AssetManager कैसे प्राप्त करें?

स्पष्टीकरण के लिए: मेरी कक्षा का उद्देश्य अन्य अनुप्रयोगों के लिए लाइब्रेरी की तरह उपयोग करना है। इसमें AndroidManifest.xml से संबंधित कोई संबंध नहीं है या इसे संदर्भित करने वाले संदर्भ पर नियंत्रण है।

उत्तर

20
  1. Application का एक उपवर्ग AndroidManifest.xml में अपने <application> टैग की android:name विशेषता अपने नए वर्ग, उदा को इंगित करने बनाएं, उदाहरण के public class App extends Application {
  2. के लिए सेट करें android:name=".App"
  3. onCreate() अपने ऐप इंस्टेंस के तरीके में, अपना संदर्भ सहेजें (उदा। this) app नामक स्थिर क्षेत्र में सहेजें और एक स्थिर विधि बनाएं जो इस फ़ील्ड को लौटाती है, उदा। getApp():

यह है कि यह कैसे दिखना चाहिए है:

public class App extends Application{ 

    private static Context mContext; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mContext = this; 
    } 

    public static Context getContext(){ 
     return mContext; 
    } 
} 

अब आप उपयोग कर सकते हैं: App.getContext() जब भी आप एक संदर्भ प्राप्त करना चाहते हैं, और फिर getAssetManager() (या App.getContext().getAssetManager())।

+0

स्पष्टीकरण के लिए, मेरी कक्षा का उद्देश्य अन्य अनुप्रयोगों के लिए लाइब्रेरी की तरह इस्तेमाल किया जाना है। इसमें कोई AndroidManifest.xml नहीं है। – ab11

+0

उस स्थिति में, एप्लिकेशन में संपत्ति प्रबंधक बनाएं और इसे लाइब्रेरी में पास करें (किसी विधि या निर्माता के माध्यम से)। – Cristian

+2

यह देखकर कि मैं अपने डेवलपर्स में अन्य डेवलपर्स द्वारा लाइब्रेरी का उपयोग कैसे करना चाहता हूं, मैं उम्मीद कर रहा था कि उन्हें संपत्ति प्रबंधक मैन्युअल रूप से सेट करने की आवश्यकता होगी। – ab11

7

मुझे ओपी प्रश्न का सबसे अच्छा जवाब नहीं है। हालांकि, मुझे पता है कि आप के रूप में Android developer resources में सुझाव दिया है जब एक स्थिर संदर्भ का उपयोग करते हुए बहुत सावधान रहना होगा कि:

अपने अनुप्रयोग उदाहरण के onCreate() विधि में, अपने संदर्भ (इस उदाहरण के लिए) एक स्थिर क्षेत्र नामित एप्लिकेशन को बचाने के और एक स्थिर विधि बनाएं जो इस फ़ील्ड को लौटाए, उदाहरण के लिए getApp():

स्थिर संदर्भों का उपयोग करके स्मृति समस्याओं को लीक करने के लिए रिसाव हो सकता है, खासकर यदि स्थिर संदर्भ दृश्यों के संदर्भों के लिए उपयोग किया जाता है।

+0

यह चिंता ऐप इंस्टेंस के लिए ही है, जो कि क्रिस्टियन के जवाब में एमसीएन्टेक्स्ट में संग्रहीत किया जा रहा है। ऐप इंस्टेंस में आपके ऐप के समान जीवनकाल है; "रिसाव" के लिए कुछ भी नहीं है। ** यूआई तक पहुंच की आवश्यकता होने पर चिंता महत्वपूर्ण हो जाती है **; उस मामले में एक 'गतिविधि' संदर्भ के रूप में पारित किया जाएगा, और यह महत्वपूर्ण है कि गतिविधि स्वयं को "अनियंत्रित" करने के लिए एक और कॉल करें, और रोकें। ऐसी तकनीक के लिए http://stackoverflow.com/a/13994622/199364 देखें, जब गतिविधि संदर्भ की आवश्यकता होती है। 'स्थिर WeakReference mContext' भी सहायक हो सकता है। – ToolmakerSteve

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