2010-10-18 19 views
7

से अधिक है तो मुझे अपने ListView के लिए आलसी छवि लोडर मिला है। मैं बेहतर मेमोरी प्रबंधन के लिए this tutorial का भी उपयोग करता हूं और बिटमैप छवियों को ArrayList में संग्रहीत करता हूं।java.lang.OutOfMemoryError: बिटमैप आकार वीएम बजट

मेरा ListView काम करता है डीबी से 8 छवियों को लोड करता है तो एक बार जब उपयोगकर्ता नीचे तक स्क्रॉल करता है तो यह एक और 8 आदि लोड करता है। 35 छवियों या उससे कम होने पर कोई समस्या नहीं थी, लेकिन कोई और मेरा ऐप बल OutOfMemoryError के साथ बंद हो जाता है।

बात यह है कि मैं नहीं समझ सकता मैं एक कोशिश पकड़ अंदर मेरे कोड है है:

try 
{ 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeByteArray(image, 0, image.length, o); 

    //Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 

    while(true) 
    { 
     if(width_tmp/2 < imageWidth || height_tmp/2 < imageHeight) 
     { 
      break; 
     } 

     width_tmp/=2; 
     height_tmp/=2; 
     scale++; 
    } 

    //Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length, o2);   
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

लेकिन कोशिश कैच ब्लॉक OutOfMemory अपवाद को पकड़ने नहीं है और से मैं SoftReference बिटमैप छवियों क्या समझ जब OutOfMemory अपवाद को फेंक दिया जा रहा है, तो एप्लिकेशन को स्मृति से बाहर चलने पर साफ़ किया जाना चाहिए।

मैं यहाँ क्या गलत कर रहा हूं?

उत्तर

4

OutOfMemoryError एक त्रुटि अपवाद नहीं है, आपको इसे पकड़ना नहीं चाहिए।

देख http://mindprod.com/jgloss/exception.html

संपादित करें: ज्ञात समस्या को देखने this issue

+0

आह मेरे बुरे ... बिल्कुल नहीं पता था। क्या ऐसा कुछ भी है जो मैं इसे रोकने से रोकने के लिए कर सकता हूं? मैं पूरी तरह से अटक गया हूँ। – mlevit

+0

आउटऑफमेमरी एरर को पकड़ने के लिए यह पूरी तरह से अच्छी समझ में आता है, अगर किसी को समस्या का समाधान करने का कोई तरीका है, या यदि कोई व्यक्ति अलग-अलग प्रक्रियाओं में एक नई गतिविधि शुरू करने के लिए उपयोगकर्ता को बताना चाहता है। – arberg

9

मैं हो सकता है लगता है इस पोस्ट की मदद से आप

//decodes image and scales it to reduce memory consumption 
private Bitmap decodeFile(File f){ 
    try { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //The new size we want to scale to 
     final int REQUIRED_SIZE=70; 

     //Find the correct scale value. It should be the power of 2. 
     int width_tmp=o.outWidth, height_tmp=o.outHeight; 
     int scale=1; 
     while(true){ 
      if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
       break; 
      width_tmp/=2; 
      height_tmp/=2; 
      scale*=2; 
     } 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) {} 
    return null; 
} 
+0

+1 बहुत उपयोगी समाधान। मेरे लिये कार्य करता है। Thanx –

+0

+1 यह उदाहरण मेरे लिए भी काम करता है। धन्यवाद! – ScratchMyTail

+0

चुनिंदा समाधान होना चाहिए! – Pascal

0

त्रुटि और अपवाद फेंकने योग्य से subclassed कर रहे हैं। त्रुटि इतनी कठोर होने वाली है, कि आपको उन्हें पकड़ना नहीं चाहिए।

लेकिन आप कुछ भी पकड़ सकते हैं।

try 
{ 
} 
catch (Throwable throwable) 
{ 
}