8

में साफ़ नहीं किया जा रहा है, मैं कुछ हार्डवेयर के लिए एंड्रॉइड मार्शमलो पोर्टिंग पर काम कर रहा हूं। जिस समस्या का सामना कर रहा हूं वह है, अगर मैं एक्सएमएल के माध्यम से यूआई ऑब्जेक्ट बनाता हूं, तो इसे जीसी द्वारा नहीं हटाया जा रहा है। उदाहरण के लिए:एक्सएमएल के माध्यम से बनाए गए UI ऑब्जेक्ट को एंड्रॉइड मार्शमलो

मैंने इसे जांचने के लिए एक ऐप बनाया है। इस ऐप में 2 गतिविधियां हैं। प्रत्येक गतिविधि में एक बटन होता है। यदि मैं इस बटन को दबाता हूं, तो यह वर्तमान गतिविधि को समाप्त करता है और अन्य गतिविधि शुरू करता है।

यदि मैं एक्सएमएल लेआउट में एक बटन को परिभाषित करता हूं और गतिविधि सेटकंटेंटव्यू में, यह टाइप बटन का ऑब्जेक्ट बना देगा। अब मैं बटन की कई ऑब्जेक्ट्स बनाने के लिए बार-बार इन सक्रियताओं को टॉगल कर रहा हूं, क्योंकि मैं किसी भी LAUNCH_MODE (जानबूझकर) का उपयोग नहीं कर रहा हूं।

अब कहें बटन के 8 ऑब्जेक्ट्स बनाए गए हैं। मैंने कई बार बटन दबाया और होम स्क्रीन पर आया। मैंने एंड्रॉइड स्टूडियो से जीसी की शुरुआत की। उसके बाद यदि मैं हीप डंप लेता हूं, फिर भी मुझे बटन के 8 उदाहरण मिलते हैं लेकिन "ऑब्जेक्ट्स के आईडी बदल दिए जाते हैं"। इसके अलावा, मैंने देखा कि जीसी शुरू करने के बाद बटन क्लास के निर्माता को बुलाया नहीं जा रहा है।

तो इन वस्तुओं को किसने बनाया। और यदि ये वही वस्तुएं हैं, तो क्यों आईडी बदल दी गई हैं।

यही बात मैं बटन वस्तु बनाने बटन जावा वर्ग का उपयोग करके करते हैं,

बटन ख = नया बटन (संदर्भ ग) की तरह;

वस्तुओं को साफ़ किया जा रहा है।

यदि आप समस्या को समझते हैं तो कृपया कुछ प्रकाश डालें।

बीआर, राहुल

+2

क्या आप एक [mcve] साझा कर सकते हैं? – antonio

उत्तर

0

आप आप क्या बात कर रहे हैं के लिए किसी भी कोड उदाहरण प्रदान नहीं किया है। मैं केवल

Button b = new Button(this); 

अनुमान लगा सकते हैं कि आप वास्तव में इन बटन वस्तुओं का निर्माण कर रहे जैसा कि आप उल्लेख किया है, आप XML में एक बटन विजेट संदर्भित कर रहे हैं, तो आप किसी भी बटन वस्तुओं नहीं बनाने दिया जाना चाहिए, आप केवल वस्तु instantiating किया जाना चाहिए।

बटन कोड

Button btnAction = (Button) findViewById(R.id.btn_action); 

यह बटन वस्तु में XML

<Button 
    android:id="@+id/btn_action" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

instantiating बटन में बनाया एकाधिक आईडी संदर्भ नहीं होना चाहिए। जब आप XML में इस विजेट को आईडी निर्दिष्ट करते हैं, तो संदर्भ आईडी तुरंत आपकी R.java फ़ाइल में जोड़ दी जाती है। अपनी आरजेजा फ़ाइल की जांच करें, आपको

public static final int btn_action=0x7f0d033b; 

यह एक अंतिम मान है, इसे बदला नहीं जा सकता है। तो हर बार जब आप ऑब्जेक्ट का संदर्भ देते हैं, btnAction, आप 0x7f0d033b का संदर्भ दे रहे हैं। अपनी गतिविधि को नष्ट करने से इस ऑब्जेक्ट को नष्ट कर दिया जाएगा जब तक आप स्थैतिक वस्तुओं को बनाने की तरह कुछ अजीब नहीं कर रहे हैं।

यह भी ध्यान दें कि कोई गारंटी नहीं है कि एक गतिविधि नष्ट होने के तुरंत बाद जीसी को बुलाया जाएगा। इसे जरूरी होने पर ज्यादातर कहा जाता है। यदि आप गतिविधि को नष्ट करते समय जीसी को "बल" करने में मदद करना चाहते हैं तो गतिविधि के डस्ट्रॉय() में साफ करें। चीयर्स!

@Override 
protected void onDestroy() { 
    // invoke garbage collector 
    System.gc(); 
} 

यह भी ध्यान रखें कि System.gc() कॉल जरूरी नहीं कचरा कलेक्टर बुलाया जाएगा। इसकी परिभाषा

वीएम को इंगित करती है कि यह कचरा कलेक्टर चलाने के लिए एक अच्छा समय होगा। ध्यान दें कि यह केवल एक संकेत है। इस बात की कोई गारंटी नहीं है कि कचरा कलेक्टर वास्तव में चलाया जाएगा।

+0

असल में मैं दोनों की कोशिश कर रहा हूं। के साथ: बटन बी = नया बटन (यह); जीसी शुरू करने के बाद बटन के ऑब्जेक्ट्स को घुमाया जा रहा है। के साथ: एक्सएमएल मार्ग जब मैं जीसी शुरू कर रहा हूं तो बटन ऑब्जेक्ट्स को घुमाया नहीं जा रहा है। मुझे समझ में आता है कि जीसी की गारंटी नहीं है, लेकिन मैं इसे एंड्रॉइड मॉनीटर से शुरू कर रहा हूं, जो सभी डी-संदर्भित वस्तुओं को साफ़ करना चाहिए। – Rahul

0

बटन को नया करने की कोई ज़रूरत नहीं है, बटन पहले से ही प्रकट में परिभाषित है, बस इसे देखने के लिए findViewById का उपयोग कर।

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