2011-02-15 27 views
24

मैं आलेख http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html से गुजर चुका हूं। इस लेख में एक वीक रेफरेंस के साथ एक स्थिर आंतरिक कक्षा का उपयोग करने का सुझाव दिया जाता है। घटना श्रोताओं के लिए कई आंतरिक कक्षाओं का उपयोग किया जाता है। क्या वे भीतरी कक्षा मेमोरी लीक का कारण बन सकती है? क्या उन आंतरिक वर्ग को स्थैतिक होना चाहिए?इवेंट श्रोता में मेमोरी रिसाव

उत्तर

36

क्या वे भीतरी कक्षा मेमोरी रिसाव का कारण बन सकती है?

संभवतः। यह इस बात पर निर्भर करता है कि उन श्रोताओं पर क्या पंजीकृत है।

उदाहरण के लिए, एक अच्छी तरह से लिखा OnClickListener एक Button के लिए एक स्मृति रिसाव में परिणाम नहीं चाहिए, क्योंकि भले ही OnClickListener एक आंतरिक वर्ग हो सकता है और Activity को एक अंतर्निहित संदर्भ हो सकता है, वस्तुओं के पूरे सेट सब सिर्फ हैं गतिविधि से बंधे हैं। इसलिए, जब गतिविधि नष्ट हो जाती है, गतिविधि, Button, और OnClickListener सभी कचरे से एकत्र हो सकते हैं।

हालांकि, LocationListener, LocationManager सिस्टम सेवा के साथ पंजीकृत, प्रक्रिया द्वारा आयोजित किया जाता है। इसलिए, भले ही गतिविधि नष्ट हो जाए, श्रोता पंजीकृत रहेगा। यदि वह श्रोता एक आंतरिक वर्ग है, तो यह गतिविधि के लिए एक निहित संदर्भ जारी रखेगा, और आपके पास स्मृति रिसाव होगी।

क्या इन आंतरिक वर्ग को स्टेइक होना चाहिए?

संभवतः। ज्यादातर मामलों में, सही उत्तर यह है कि "यदि आप यूआई के अलावा अन्य श्रोता पंजीकृत कर रहे हैं, तो उचित बिंदु पर इसे अनियंत्रित करना सुनिश्चित करें"। उस मामले में, कोई रिसाव नहीं होगा।

क्या कोई मुझे कोई उदाहरण कोड दे सकता है कि ईवेंट श्रोता रिसाव-सबूत का उपयोग कैसे कर सकता है।

सार में नहीं, नहीं।

+0

यहां एक साधारण श्रोता है जो स्मृति रिसाव का कारण बनता है http://stackoverflow.com/questions/7083441/android-alertdialog-causes-a-memory-leak – user4o01

+0

मुझे कैसे पता चलेगा कि श्रोता गतिविधि से जुड़ा हुआ है या नहीं प्रक्रिया द्वारा? – Jaskey

+0

@ कॉमन्सवेयर फिर से सर मर्फी धन्यवाद। –

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