2012-05-24 12 views
6

जब मैं लैंडस्केप मोड में बदलता हूं, तो पूर्ण ऑब्जेक्ट्स के बिटमैप के साथ कुछ ऑब्जेक्ट बनाए जाते हैं।बिटमैप आकार Vm बजट त्रुटि से अधिक है

जब मैं स्क्रॉल अन्य वस्तु कहा जाता है और उसके बिटमैप, प्रदर्शित किया जाता है जब मैं इस बार बार कर रही है, बिटमैप आकार vm बजट त्रुटि से अधिक है, मैं सब बातों recycle() की तरह, किया है अशक्त सेट और फिर GC() कहा जाता है, अभी भी मेरे पास है एक ही त्रुटि बिटमैप बनाना ....

bitmap = Bitmap.createBitmap(ChartProperties.getChartWidth(), 
        ChartProperties.getChartHeight(), 
    Bitmap.Config.RGB_565); 

    imageCache.put(String.valueOf(LandscapeChartActivity.getActiveFeature()), 
        new SoftReference(bitmap)); 

    if(imageCache != null){ 

     for (int i = 0; i < imageCache.size(); i++) { 

      if (imageCache.get(String.valueOf(i)) != null) { 
       imageCache.get(String.valueOf(i)).get().recycle(); 
       imageCache.put(String.valueOf(i), null);      
      } 

     } 
     Runtime.getRuntime().gc(); 
     imageCache.clear(); 
     imageCache = null; 
+0

के संभावित डुप्लिकेट [OutOfMemoryError: बिटमैप आकार से बड़ा वीएम बजट: - एंड्रॉयड] (http://stackoverflow.com/questions/2928002/outofmemoryerror-bitmap-size-exceeds-vm-budget -android) –

+2

हर बार जब आप एक लूप में 'आकार()' कहते हैं, तो भगवान एक बिल्ली का बच्चा मारता है ... – WarrenFaith

उत्तर

7

मुझे बिटमैप्स की वजह से ओओएमई भी यही समस्या थी।

जब पोर्ट्रेट से लैंडस्केप में अभिविन्यास बदलता है और इसके विपरीत, पिछला यूआई पूरी तरह से त्याग दिया जाता है, और एक नया यूआई लोड और प्रदर्शित होता है, इस मामले में यदि आप अपने ऐप में कई बिटमैप्स का उपयोग कर रहे हैं, तो आपको उन्हें छोड़ना होगा उचित जगहों पर

अपने डिवाइस के उन्मुखीकरण की जाँच के लिए, कृपया इस देखें: Check orientation on Android phone

आपके मामले में, आप उन्मुखीकरण परिवर्तन के दौरान बिटमैप्स स्पष्ट करने की जरूरत है।

उपर्युक्त लिंक पर आप पाएंगे कि वर्तमान अभिविन्यास कैसे प्राप्त करें। तो प्रत्येक अभिविन्यास परिवर्तन पर, अपने उपरोक्त कोड को कॉल करें जो बिटमैप्स को साफ़ करता है।

अब, जब हम logcat जाँच, वहाँ हमेशा है एक लॉग GC_ कह ऊपर आता है, लेकिन मुझे लगता है कि समझ में नहीं कर सका, इसलिए मैं स्मृति रिसाव मुद्दे पर एक अद्भुत दस्तावेज़ पाया: http://codelog.dexetra.com/getting-around-android-memory-blues

ऊपर के लिंक है आपकी समस्या के लिए बहुत उपयोगी है।

अब, ओओएमई तब होता है जब आपके ऐप में मेमोरी रिसाव होता है, इसलिए इसे जांचने के लिए, कृपया ग्रहण के लिए MAT इंस्टॉल करें। आप इसे यहां देख सकते हैं: http://www.eclipse.org/mat/downloads.php

यह थोड़ा जटिल सॉफ़्टवेयर है, लेकिन जैसे ही आप इसे देखते हैं, आप समझेंगे, यह बहुत उपयोगी सॉफ्टवेयर है।

भले ही यह आपकी समस्या का समाधान नहीं करता है, तो बिटमैप्स के लिए WeakReference का उपयोग करें।

इस लिंक देखें: How to use WeakReference in Java and Android development?

अगर मैं कुछ और अधिक जानकारी पता मिलता है, मैं इस पोस्ट अद्यतन करेगा।

यदि आप अपनी समस्या का समाधान करते हैं तो कृपया अपनी पोस्ट अपडेट करें।

आप :) धन्यवाद

+0

धन्यवाद, लेकिन मेरे कोड में मैं पहले से ही बिटमैप साफ़ करता हूं, जबकि अभिविन्यास परिवर्तन होता है, लेकिन फिर भी कई बार फ्लिप होने पर त्रुटि होती है .. if (! imageCache = नल) {के लिए (int i = 0; i

+0

निश्चित रूप से आपके ऐप में एक मेमोरी लीक है, कृपया ग्रहण के लिए MAT इंस्टॉल करें। आपको सटीक जगह पता चल जाएगा जहां स्मृति रिसाव मौजूद है ताकि आप इसे सुधार सकें। – Shrikant

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

  • कोई संबंधित समस्या नहीं^_^