मैं एंड्रॉइड विकास के लिए काफी नया हूं और मुझे जावा आउट ऑफ़ मेमोरी अपवाद को समझने की प्रतीत नहीं होती है। मुझे पता है कि इसका मतलब है कि मेरा ऐप वीएम बजट पर चला गया है लेकिन कई बार गुगल करने के बाद भी मुझे इस अवधारणा को समझने की प्रतीत नहीं होती है। मुझे डर है कि मेरा ऐप बहुत अधिक मेमोरी का उपयोग करता है क्योंकि मेरे पास प्रत्येक चयनकर्ता के लिए दो बिटमैप्स के साथ प्रति स्क्रीन छह बटन चयनकर्ता हैं जो गुण टैब के अनुसार लगभग 20 केबी हैं। मेरे रूट किए गए जी 2 एक्स पर मैंने वीएम बजट को 12 एमबी पर सेट किया है, मेरे फोन को फिर से शुरू किया है और बिना किसी समस्या के मेरे ऐप को चलाया है। मैं प्रत्येक ऑनस्ट्रोय() पर ड्रॉबल्स को अनबाइंडिंग कर रहा हूं और जीसी पर भी यहां दौड़ने के लिए संकेत दे रहा हूं। एमुलेटर में थोड़ी देर के लिए ऐप का उपयोग करने के बाद, मैं अपनी डीडीएमएस स्क्रीन पर "कारण जीसी" पर क्लिक करता हूं और परिणाम आईडी = 1, हीप आकार 6.133 एमबी, आवंटित 2.8 9 5 एमबी, नि: शुल्क 3.238 एमबी,% प्रयुक्त 47.20, # ऑब्जेक्ट्स 52,623।एंड्रॉइड समझना ढेर आकार
यह वह जगह है जहां मुझे नहीं पता कि क्या हो रहा है, मेरा एमुलेटर 24 एमबी वीएम पर सेट है। वह संख्या कहां है? मेरी वास्तविक समस्या यह है कि अगर मैं एम्यूलेटर को 16 एमबी वीएम पर सेट करता हूं तो मेरा ऐप आउट ऑफ़ मेमोरी अपवाद के साथ दूसरी गतिविधि पर क्रैश हो जाता है। यह मेरे फोन पर वीएम सेट के साथ 12 एमबी या मेरे पुराने एचटीसी मैजिक फोन पर 12 एमबी वीएम स्टॉक के साथ कैसे क्रैश नहीं होता है? क्या आप लोग सोचते हैं कि मेरा ऐप बहुत अधिक मेमोरी ले रहा है? मुझे नहीं पता कि उन डीडीएमएस नंबर अच्छे हैं या नहीं। आपके समय के लिए धन्यवाद।
मेरे कोड के लिए मेरे पास XML लेआउट में निर्दिष्ट प्रत्येक छवि है, मैं उन्हें श्रोताओं को जोड़ने के अलावा प्रोग्रामिंग के साथ कुछ भी नहीं करता हूं। मैं यहाँ पर कोड के इस बिट मिल गया है और मैं इसे हर गतिविधि मेरे पास है में शामिल किया है ...
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
अन्यथा सब मुझे क्या करना बटन है कि पीएनजी पृष्ठभूमि को onClickListeners जोड़ने है। मैं सीखना चाहता हूं कि बटन पृष्ठभूमि को प्रोग्रामेटिक रूप से कैसे निर्दिष्ट किया जाए, लेकिन मुझे बटन इंटरैक्शन के अनुसार बटन पृष्ठभूमि बदलने के लिए, फोकस पर, फोकस, गैर-केंद्रित लेकिन दबाए गए आदि जैसे चयनकर्ता फ़ंक्शंस की आवश्यकता होती है। मैंने इस बारे में दस्तावेज़ों की समीक्षा की है लेकिन यह भारी लग रहा है, इसलिए मैंने सोचा कि मैं यहां ढेर के प्रबंधन की मूल बातें के साथ शुरू करूंगा और कोड में चयनकर्ताओं को निर्दिष्ट करने के लिए अपना रास्ता तैयार करूंगा। यह समझ में नहीं आता है लेकिन क्या स्मृति की आवंटन की "स्वस्थ" मात्रा है कि एक ऐप आउट ऑफ़ मेमोरी अपवाद के करीब बिना आवंटित किया जा सकता है? उदाहरण के लिए यदि कोई ऐप 6 एमबी आवंटित किया गया तो यह ठीक होना चाहिए लेकिन 8 एमबी इसे धक्का दे रहा है, क्या स्मृति आवंटन में ऐसी सीमाएं हैं? धन्यवाद, आपकी प्रतिक्रिया के लिए फिर से एलेक्स लॉकवुड मैं इसे पढ़ने और फिर से पढ़ने के लिए जा रहा हूं जब तक कि यह सामान मुझे समझ में नहीं आता है
+1, बहुत ही जानकारीपूर्ण जवाब! –
बहुत बहुत धन्यवाद! मैंने उससे बहुत कुछ सीखा। मैं प्रश्न के नीचे कुछ जानकारी जोड़ रहा हूं –
पुन: संकल्प टिप्पणी "20 केबी प्रत्येक ठीक लगता है" - AFAIK, इससे कोई फ़र्क नहीं पड़ता कि * फ़ाइल आकार * क्या है (जो छवियों के लिए बेहतर होगा जो बेहतर हो) यह मायने रखता है कि * डायमेंशन * क्या हैं; स्मृति में, पूर्ण रंग के लिए, 4 बी प्रति पिक्सल ले जाएगा, है ना? इसलिए, जब आप इसे लोड करते हैं तो छवि को आकार देने के लिए महत्वपूर्ण है [एंड्रॉइड दस्तावेज़ - वास्तविक स्केल किए गए संस्करण को मेमोरी में लोड करें], वर्तमान डिवाइस के लिए वास्तविक आवश्यक आकार के आधार पर। – ToolmakerSteve