मैं अपनी सभी गतिविधियों के लिए पृष्ठभूमि के रूप में सेट करने के लिए एक छवि का उपयोग कर रहा हूं लेकिन यह मेमोरी ओवरफ़्लो समस्या उत्पन्न कर रहा है और ऐप को क्रैश कर रहा है। अब मैं अपनी गतिविधियों में विराम() और Destroy() पर अपने drawables unbinding हूँ और अब यह वापस बटन दबाए पर खाली स्क्रीन दिखाता है। तो मैं अतिरिक्त मेमोरी का उपयोग किये बिना इस से कैसे बच सकता हूं।अप्रतिबंधित बैक नेविगेशन को उत्पन्न करने के कारण रोकें() इस समस्या को छोड़कर मेमोरी ओवरफ्लो
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.login_root));
}
protected void onDestroy() {
unbindDrawables(findViewById(R.id.login_root));
super.onDestroy();
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
शुरू में मैं अपने लेआउट एंड्रॉयड का उपयोग कर बढ़ा-चढ़ाकर किया गया था: पृष्ठभूमि = "@ drawable /" जो हमेशा कहते वीएम हमें 10 एमबी का आवंटन नहीं दूँगी कि स्मृति अतिप्रवाह त्रुटि के कारण अब मैं से एक बिटमैप हो रही है (अनुप्रयोग।) जो स्केलिंग के बिना ड्रॉइंग और रनटाइम पर बाध्यकारी है। अब यह कहता है कि वीएम हमें अनइंडड्राउबल्स (..) का उपयोग किए बिना 5 एमबी (एप।) आवंटित नहीं करने देगा। स्पष्ट रूप से दिखाए गए पृष्ठभूमि छवि की गुणवत्ता में कमी आई है लेकिन मैं सक्षम नहीं हूं यह समझने के लिए कि यदि मैं 13 केबी की पीएनजी फ़ाइल का उपयोग कर रहा हूं, तो अनुरोध को संसाधित करने के लिए JVM को 5 या 10 एमबी स्पेस की आवश्यकता होती है?
मैंने अपने लेआउट कथन को ऑनरेट() से ऑनस्यूम() विधि में स्थानांतरित कर दिया है लेकिन एप्लिकेशन फिर से बटन दबाकर स्मृति से बाहर चला गया है।
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void onResume(){
setContentView(R.layout.home);
Bitmap bmp;
ImageView background = (ImageView)findViewById(R.id.iv_home_background);
InputStream is = getResources().openRawResource(R.drawable.background);
bmp = BitmapFactory.decodeStream(is);
background.setImageBitmap(bmp);
super.onResume();
}
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.home_root));
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
पर याद रखें कि याद रखें कि अगर ऑनस्ट्राय() कहा जाता है, तो रोकें() को पहले भी कहा जाता है। –
केवल 'ऑन पॉज़()' में अनइंड करें जैसा कि जॉन जोट्रियनो ने कहा था। लेकिन फिर भी, हमें अपना ऑनस्यूम फ़ंक्शन –
दिखाएं, मैंने रेज़्यूमे फ़ंक्शन पर अपना ओवरराइड नहीं किया। मुझे बिल्कुल पता नहीं है कि वहां क्या करना है। – Atinder