2010-10-18 17 views
7

Así que tengo un cargador de imágenes diferido para mi ListView. También uso this tutorial para una mejor gestión de memoria y tengo SoftReference imágenes de mapa de bits almacenadas en mi ArrayList.java.lang.OutOfMemoryError: el tamaño del mapa de bits excede el presupuesto de la VM

Mi ListView funciona carga 8 imágenes de un DB luego una vez que el usuario se desplaza hasta el fondo carga otros 8 etc. etc. No hubo problema cuando había alrededor de 35 imágenes o menos, pero más y mi aplicación Fuerza cierra con OutOfMemoryError.

Lo que no puedo entender es que tengo mi código dentro de un intento de captura:

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(); 
} 

Pero el bloque intento de captura no está alcanzando la excepción OutOfMemory y por lo que entiendo los SoftReference imágenes de mapa de bits debe borrarse cuando la aplicación se está quedando sin memoria para detener la excepción OutOfMemory.

¿Qué estoy haciendo mal aquí?

Respuesta

4

OutOfMemoryError es un error, no es una excepción, no debe atraparlo.

ver http://mindprod.com/jgloss/exception.html

EDIT: conocido problema de ver this issue

+0

Ah my bad ... no lo sabía en absoluto. ¿Hay algo que pueda hacer para evitar que suceda? Estoy completamente atascado. – mlevit

+0

Tiene mucho sentido atrapar OutOfMemoryError, si se tiene alguna manera de resolver el problema, o si se quiere decirle al usuario, por ejemplo, comenzando una nueva actividad en un proceso por separado. – arberg

9

supongo que puede ser este post le ayudará a

//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 Solución muy útil. Funciona para mi. Gracias –

+0

+1 Este ejemplo también me funciona. ¡Gracias! – ScratchMyTail

+0

¡Debe ser la solución seleccionada! – Pascal

0

errores y excepciones son subclases de Throwable. Se supone que el error es tan drástico, que no debe atraparlos.

Pero puede atrapar cualquier cosa.

try 
{ 
} 
catch (Throwable throwable) 
{ 
} 
Cuestiones relacionadas