2010-07-27 13 views
25

मैंने पढ़ा है कि यह एक गलती है और एक संदर्भ में लंबे समय तक रहने वाले संदर्भ रखने के लिए एंड्रॉइड एप्लिकेशन में मेमोरी लीक का स्रोत है।एंड्रॉइड: एक संदर्भ और मेमोरी लीक के संदर्भ

लेकिन मुझे समझ नहीं आता है, तो यह ठीक है एक वर्ग है कि यह एक तरह लग रहा है बनाने के लिए:

public class HelperClass { 
    private Context context; 

    public HelperClass(Context context) { 
     this.context = context; 
    } 
    public void myHelperMethod() { 
     // uses this.context 
    } 
} 

और यह एक गतिविधि से फोन:

public class MyActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     HelperClass h = new HelperClass(this); 
     h.myHelperMethod(); 
    } 

    ... 
} 

उत्तर

43

यह ठीक है, और एक स्मृति रिसाव का कारण नहीं होगा।

जैसे ही onCreate निष्पादन समाप्त होता है, h दायरे से बाहर हो जाएगा और कचरा संग्रह के लिए योग्य बन जाएगा। यदि h स्थैतिक था, तो आप समस्याओं में भाग लेंगे। केवल जब संदर्भ के संदर्भ में संदर्भ के जीवन चक्र से बाहर निकलता है तो स्मृति मेमोरी होगी। कुछ उपयोगी संकेत:

  • संभव होने पर Context.getApplicationContext() का उपयोग करें। यह संदर्भ तब तक लाइव रहेगा जब तक आपका एप्लिकेशन ज़िंदा न हो।
  • स्थिर फ़ील्ड और आंतरिक कक्षाओं का उपयोग करते समय सावधान रहें। लीक की जांच के लिए
  • Run your application through a profiler
+1

क्या होगा यदि आपके पास अपनी गतिविधि में ऐसे सहायक वर्ग के साथ एक निजी चर है, जिसमें 'संदर्भ' संदर्भ है? – Peterdk

+2

@Peterdk यदि आपका चर ConAxticationContext() से संदर्भ उदाहरण धारण कर रहा है, कोई समस्या नहीं है। लेकिन यदि आप किसी गतिविधि से संदर्भ धारण कर रहे हैं, तो मेमोरी लीक के साथ सावधानी बरतें (आवश्यकतानुसार क्रियाकलापों से अधिक उचित तरीके से आयोजन करना)। शायद आपको गतिविधि संदर्भ उदाहरण को पकड़ने के लिए वीक रेफरेंस का उपयोग करना चाहिए और यह जानने के लिए श्रोता का उपयोग करना चाहिए कि आपका एप्लिकेशन अन्य गतिविधि में कब बदल गया है। – marciowb

6

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

यह एक अलग कहानी होगी यदि "एच" एक स्थिर सदस्य था - यह स्मृति को रिसाव करने का एक शानदार तरीका होगा।

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