2017-01-05 11 views
6

मुझे उत्सुकता है कि नीचे एक स्मृति रिसाव क्यों है क्योंकि mHandler मुख्य थ्रेड पर बनाया गया है और अब जब डस्ट्रॉय को बुलाया जाता है तो यह थ्रेड को मारता है? गतिविधि नष्ट होने के बाद हैंडलर कैसे मौजूद हो सकता है? मैंने एक नया धागा नहीं बनाया है। क्या मैं समझता हूं कि एक हैंडलर अगर इसमें चीजें हैं तो मैं धागा नष्ट होने के बाद भी संदेश कतार रहूंगा?एंड्रॉइड - मुख्य रूप से हैंडलर मेमोरी लीक का कारण बन सकता है?

संदर्भ दस्तावेज़ im पढ़ने here enter image description here

उत्तर

13

हैंडलर मुख्य रूप से थ्रेड के संदेश क्यूई में ईवेंट पोस्ट करने के लिए उपयोग किए जाते हैं। प्रत्येक हैंडलर उदाहरण एक थ्रेड और उस थ्रेड के संदेश कतार से जुड़ा हुआ है।

इसलिए जब आप गतिविधि से देरी से एक runnable, और बाहर निकलने के बाद, MainThread, नष्ट नहीं किया जाएगा के रूप में अभी भी MessageQueue में घटनाओं विलंब के बाद संसाधित करने के लिए, तो यह एक memoryLeak पैदा कर सकता है रननेबल के आपके अज्ञात आंतरिक वर्ग के रूप में गतिविधिउदाहरण का संदर्भ धारण कर रहा है।

तो

handler.removeCallbacksAndMessages(null); 
इस

बुला अपनी गतिविधि रवाना होने से पहले सभी लंबित संदेश और कॉलबैक साफ हो जाएगा द्वारा onStop() गतिविधि की में सभी संदेशों को दूर करने के लिए सुनिश्चित करें।

+0

तो आपकी कहानियां अगर हैंडलर के कतार में संदेश हैं तो इसे चलाना जारी रखना चाहिए, भले ही इसे खत्म करने पर गतिविधि बनाई गई हो, है ना? – j2emanue

+0

और मेरे उदाहरण के मामले में, हैंडलर मुख्य थ्रेड से जुड़ा हुआ है। और मैं मुख्य धागे looper के लिए runnables पोस्ट कर रहा हूँ। अब जब गतिविधि डेस्ट्रॉय पर कॉल करती है क्योंकि मुख्य थ्रेड्स लूपर कतार में अभी भी संदेश हैं तो जीसी गतिविधि एकत्र नहीं करेगा? या यह है कि जीसी दौड़ने योग्य संदर्भ के कारण गतिविधि एकत्र नहीं करेगा? देखें मेरा मतलब क्या है? मान लें कि रननेबल में कोई गतिविधि संदर्भ नहीं था? क्या यह अभी भी लीक हो जाएगा? – j2emanue

+0

@ j2emanue यदि आपके रननेबल में कोई गतिविधि संदर्भ नहीं है, तो उस स्थिति में गतिविधि रिसाव नहीं होगा, लेकिन फिर भी मुख्य धागा जीवित रहेगा क्योंकि इसे चलने योग्य संदेश कतार में ईवेंट को समाप्त करना होगा। –

0

वे कर सकते हैं, लेकिन Runnable की Handler- कि पोस्ट किया जाता है की नहीं है। एक हैंडलर काम करता है कि यह एक थ्रेड से जुड़ा हुआ है। उस थ्रेड में लूपर होना चाहिए। एक लूपर में एक संदेश कतार है। जब आप पोस्ट करते हैं, तो आप उस लूपर की संदेश कतार में रननेबल जोड़ते हैं। इसलिए थ्रेड के पास रननेबल का संदर्भ है। तो रननेबल लीक हो जाएगा, और यदि गैर स्थैतिक माता-पिता वर्ग लीक हो जाएंगे।

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