2011-04-24 8 views
13

देखें पदानुक्रम निम्नानुसार है TabActivity ->ActivityGroups ->Activitiesइनपुट मोड मैनेजर टैबहोस्ट का संदर्भ रखता है - मेमोरी लीक - ओओएम त्रुटि

मेट का उपयोग करते हुए मैंने पाया कि TabWidgetTabHost जो InputMethodManager द्वारा संदर्भित है द्वारा संदर्भित है, इसलिए TabWidget लीक कर रहा है। आवेदन के बाद के लॉन्च पर आउटऑफमेमरी त्रुटि फेंक दी गई है।

इसी प्रकार मेरी सभी गतिविधियों का भी InputMethodManager द्वारा संदर्भित किया गया है। ठीक से आवेदन परिष्करण पर

(वापस कुंजी मार) (आवेदन अपने सभी activitygroups, गतिविधियों, tabactivity, tabhost और tabwidget लीक कर रहे हैं !! बंद करने के बाद), निम्नलिखित logcat में दिखाया गया है

चेतावनी/InputManagerService (99): गैर ध्यान केंद्रित ग्राहक [email protected] पर इनपुट शुरू (uid = 10052 पीआईडी ​​= 1463)

InputMethodManager से संदर्भ को हटाने के लिए कैसे .. ।?

बात मैंने कोशिश की:

ए इस विधि कहा जाता है मेरी TabActivity
1. myTabWidget.removeAllViews()
2. myTabWidger.invalidate()

कोई किस्मत की onDestroy!


उत्तर

1

बात मैंने कोशिश की: ए मेरे TabActivity 1.myTabWidget.removeAllViews() 2.myTabWidger.invalidate की इस पद्धति OnDestroy कहा जाता है()

बेशक, यह काम नहीं करेगा। गतिविधियां न तो एमवीसी/एमवीपी/एमवीवीएम में और न ही एंड्रॉइड एसडीके कक्षा पदानुक्रम में विचार नहीं हैं। android.app.Activity android.view.View देखें

मेरे सहयोगी को स्मृति रिसाव के साथ समान समस्या थी - उन्होंने स्थिर तरीके से टैबएक्टिविटी में टैबहोस्ट घोषित किया (वह इसे किसी अन्य गतिविधि से एक्सेस करना चाहता था, जब वह नहीं था पैटर्न पर्यवेक्षक से परिचित)। मुझे लगता है कि आपने कुछ ऐसा ही बनाया है।

और आखिर में, मेरा प्रश्न: आप InputMethodManager में गतिविधियों का संदर्भ क्यों देते हैं (हालांकि मुझे समझ में नहीं आता कि यह कैसे अंतिम श्रेणी है) और गतिविधियों में InputMethodManager नहीं है? यदि आप InputMethodManager के लिए वैश्विक फोकस पॉइंट चाहते हैं, तो मैं आपको सलाह देता हूं कि आप इसे एप्लिकेशन क्लास में संदर्भित करें। हम आवेदन वर्ग (उदाहरण के लिए, होस्ट अनुप्रयोग) का विस्तार करते हैं, इस मुखौटे में हम सामान्य सामान (उदाहरण के लिए साझा किए गए संदर्भ) घोषित करते हैं। और गतिविधियों में हम लिखते हैं:

HostApplication application = (HostApplication) getApplication(); 

तब हमें इससे उपयोगी सामान मिलते हैं।

+0

मैं InputMethodManager वैसे भी उल्लेख नहीं है (FYI करें, मैं एक बिंदु पर दो TabActivities देखने के लिए सक्षम था, लेकिन समस्या InputMethodManager नहीं था, यह कोड में एक स्थिर संदर्भ) था। क्या आप मुझे लिंक प्रदान कर सकते हैं जो "पैटर्न पर्यवेक्षक" के बारे में अधिक बताता है? – Mani

+1

http://en.wikipedia.org/wiki/Observer_pattern हमने पर्यवेक्षक (विषय) के रूप में एक मॉडल बनाया, और गतिविधियां पर्यवेक्षक थे (उन्होंने इंटरफ़ेस "पर्यवेक्षक" लागू किया)। शुरुआत में, गतिविधि मॉडल में खुद पंजीकृत है (हम सिंगलटन का उपयोग करते हैं, लेकिन आप सेवा या एप्लिकेशन का उपयोग कर सकते हैं)। अगर कुछ रोचक, अवलोकन करने योग्य घटना थी और प्रत्येक ग्राहक को अधिसूचित किया गया था। नष्ट करने से पहले, स्मृति स्मृति रिसाव से बचने के लिए स्वयं को पर्यवेक्षित में अनियंत्रित कर दिया गया। एंड्रॉइड में मेमोरी रिसाव के अधिकांश कारण बहुत सरल हैं: संदर्भ/दृश्य/संवाद कहीं स्थैतिक तरीके से घोषित किए गए थे। – QuickNick

3

मैं भी इस समस्या से मुलाकात की और मैंने इससे बचने के लिए कुछ रास्ता तय किया।जब मेरी गतिविधि समाप्त हो जाती है, तो मैं इनपुट विधि प्रबंधक सेवा के साथ कनेक्शन को काटने का प्रयास करता हूं। इसे देखें:

class MyActivity extend Activity { 
    @Override 
    public void finish() { 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.windowDismissed(mContentView.getWindowToken()); 
     super.finish(); 
    } 
} 

मुझे यकीन नहीं है कि यह इस स्मृति रिसाव को ठीक कर सकता है या नहीं। अभी के लिए, यह ठीक काम करता है। आप कोशिश कर सकते हैं।

+1

mContentView, tablayout के रूट दृश्य का संदर्भ है? – Mani

+0

InputMethodManager.windowDismissed एंड्रॉइड एपीआई में एक छिपी हुई विधि है। तो, नहीं, यह ठीक काम नहीं करता है। इसे काम करने के लिए, आपको प्रतिबिंब का उपयोग करना होगा: '((कक्षा .forName (" android.view.inputmethod.InputMethodManager "))। GetMethod (" windowDismissed ", IBinder.class))। (Null, mContentView.getWindowToken()); ' – iamreptar

1

क्या आप वाकई मेमोरी लीक असली हैं? मेरे पास एक समान स्थिति है, और यह मैट में मेमोरी रिसाव की तरह दिखता है, लेकिन इनपुट इनपुट विधि के कारण मुझे टैबएक्टिविटी के दो उदाहरण दिखाई नहीं दे सकते हैं। निश्चित रूप से, इनपुट मोड मैनेजर टैबएक्टिविटी को कचरा इकट्ठा करने से रोकता है। लेकिन, अगर यह एक वास्तविक स्मृति रिसाव था, तो क्या मैं दो TabActivites, फिर तीन, फिर चार देखने में सक्षम नहीं होगा?

+0

हाँ आप सही हैं। इनपुटमैथो मैनेज कुछ भी नहीं करता है। समस्या एक स्थिर संदर्भ के साथ है जिसका उपयोग मैंने चयनित टैब को स्विच करने के लिए किया था। उपरोक्त उत्तर में "क्विकनिक" ने उल्लिखित पैटर्न का उपयोग करके स्थिर संदर्भ को हटाने के तरीके का उल्लेख किया है। – Mani

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