2012-09-12 2 views
6

मैं अपनी सभी गतिविधियों के लिए पृष्ठभूमि के रूप में सेट करने के लिए एक छवि का उपयोग कर रहा हूं लेकिन यह मेमोरी ओवरफ़्लो समस्या उत्पन्न कर रहा है और ऐप को क्रैश कर रहा है। अब मैं अपनी गतिविधियों में विराम() और 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(); 
     } 
    } 
+0

पर याद रखें कि याद रखें कि अगर ऑनस्ट्राय() कहा जाता है, तो रोकें() को पहले भी कहा जाता है। –

+0

केवल 'ऑन पॉज़()' में अनइंड करें जैसा कि जॉन जोट्रियनो ने कहा था। लेकिन फिर भी, हमें अपना ऑनस्यूम फ़ंक्शन –

+0

दिखाएं, मैंने रेज़्यूमे फ़ंक्शन पर अपना ओवरराइड नहीं किया। मुझे बिल्कुल पता नहीं है कि वहां क्या करना है। – Atinder

उत्तर

1

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

0

आप प्रत्येक उप दृश्य के लिए जीसी को कॉल कर रहे हैं। इसे केवल एक बार कॉल करने का प्रयास करें जब सभी unbinds किया जाता है।

unbindDrawables(findViewById(R.id.login_root)); 
System.gc(); 

जीसी भारी भार है और इसे अक्सर कॉल करने के लिए बेकार है। वास्तव में, यदि कोई रिसाव नहीं है तो यह बिल्कुल नस्लीय होना चाहिए।

यह भी ध्यान रखें कि पीएनजी फ़ाइल आकारों में स्मृति पर बिटमैप के साथ कुछ लेना देना नहीं है। यहां http://developer.android.com/training/displaying-bitmaps/index.html

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