2010-10-18 3 views
7

J'ai donc un chargeur d'images paresseux pour mon ListView. J'utilise également this tutorial pour une meilleure gestion de la mémoire et j'ai SoftReference images bitmap stockées dans mon ArrayList.java.lang.OutOfMemoryError: la taille de l'image dépasse le budget de la machine virtuelle

Mes travaux ListView charge 8 images d'une base de données puis une fois que l'utilisateur fait défiler vers le bas, il charge 8 autres etc. Il n'y avait aucun problème lorsqu'il y avait environ 35 images ou moins, mais plus et mon application Force se ferme avec OutOfMemoryError.

La seule chose que je ne comprends pas est que j'ai mon code dans une prise try:

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

Mais le bloc catch try ne rattrape pas l'exception OutOfMemory et de ce que je comprends les SoftReference images Bitmap devrait être effacé lorsque l'application est à court de mémoire en arrêtant l'exception OutOfMemory levée.

Qu'est-ce que je fais mal ici?

Répondre

4

OutOfMemoryError est une erreur pas une exception, vous ne devriez pas l'attraper.

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

EDIT: problème connu voir this issue

+0

Ah mon mauvais ... ne le savais pas du tout. Est-ce que je peux faire quelque chose pour l'empêcher? Je suis complètement coincé. – mlevit

+0

Il est parfaitement logique d'attraper OutOfMemoryError, si on a un moyen de résoudre le problème, ou si l'on veut dire à l'utilisateur, par exemple, de démarrer une nouvelle activité dans un processus séparé. – arberg

9

Je suppose peut-être ce poste vous aidera

//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 Solution très utile. Travaille pour moi. Thanx –

+0

+1 Cet exemple fonctionne également pour moi. Je vous remercie! – ScratchMyTail

+0

Devrait être la solution de sélection! – Pascal

0

erreur et exception sont de sous-classé Throwable. Les erreurs sont censées être si drastiques, que vous ne devriez pas les attraper.

Mais vous pouvez attraper n'importe quoi.

try 
{ 
} 
catch (Throwable throwable) 
{ 
} 
Questions connexes