2011-09-12 4 views
1

Dans mon application, je télécharge des images à partir du Web. Pour cela, la première fois que je télécharge des images du web et ces images sont stockées dans la carte SD. La prochaine fois, je vérifie que ces images sont en sdcard ou non. si oui, aller chercher la carte SD sinon je télécharge sur le web. Ces images sont affichées comme liste. Je suis à plusieurs reprises (signifie déplacer vers le haut/bas en continu) en faisant défiler la liste puis mon application s'est écrasé et je reçois l'exception de mémoire insuffisante. Comment le gérer. quelqu'un peut-il m'aider?android - Problème de mémoire insuffisante

Stacktrace:

09-12 13:40:42.640: ERROR/AndroidRuntime(3426): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=7879KB, Allocated=3362KB, Bitmap Size=11402KB) 
09-12 13:40:42.640: ERROR/AndroidRuntime(3426):  at android.graphics.BitmapFactory.nativeDecodeFile(Native Method) 
09-12 13:40:42.640: ERROR/AndroidRuntime(3426):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:355) 
09-12 13:40:42.640: ERROR/AndroidRuntime(3426):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:433) 
09-12 13:40:42.640: ERROR/AndroidRuntime(3426):  at com.ibkr.elgifto.GiftCategories$itemlistadapter$4.getDrawableFromUrl(GiftCategories.java:830) 
09-12 13:40:42.640: ERROR/AndroidRuntime(3426):  at com.ibkr.elgifto.GiftCategories$itemlistadapter$4.run(GiftCategories.java:739) 
09-12 13:53:32.450: INFO/WSP(332): [Receiver] next auto-sync alarm event is 180 mins later, at time: Mon Sep 12 16:53:32 GMT+05:30 2011 

Code

private Drawable getDrawableFromUrl(String imageUrl) { 

    // TODO Auto-generated method stub 
    String filename = imageUrl; 
    filename = filename.replace("/", "+"); 
    filename = filename.replace(":", "+"); 
    filename = filename.replace("~", "s"); 
    File elgiftoimagesref = new File("/sdcard/Elgiftoimages/"); 

    elgiftoimagesref.mkdir(); 

    final File file = new File(elgiftoimagesref, filename); 
    BitmapDrawable SDdrawable = null; 

    boolean exists = file.exists(); 
    if (!exists) { 
     try { 
      URL myFileUrl = new URL(imageUrl); 
      HttpURLConnection conn = (HttpURLConnection) myFileUrl 
        .openConnection(); 
      conn.setDoInput(true); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      final Bitmap result = BitmapFactory.decodeStream(is); 
      is.close(); 
      new Thread() { 
       public void run() { 
        ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
        if (result != null) { 
         result.compress(Bitmap.CompressFormat.JPEG, 40, 
           bytes); 
        } 
        try { 

         FileOutputStream fo; 
         fo = new FileOutputStream(file); 
         fo.write(bytes.toByteArray()); 

         fo.flush(); 
         fo.close(); 
         // result.recycle(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }.start(); 
      BitmapDrawable returnResult = new BitmapDrawable(result); 
      return returnResult; 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } else { 

     // Here i am getting the out of memory error. 
     SDdrawable = new BitmapDrawable(BitmapFactory.decodeFile(file 
       .toString())); 
     return SDdrawable; 
    } 
}  
+0

diminuer la taille des images et essayer – Abhi

+0

ici i suis la compression de l'image, il ne suffit pas alors comment diminuer la taille? – naresh

+0

Vous semblez les décompresser en mémoire, puis les recomprimer en mode sauvegarde ... peut-être ignorer cela et enregistrer le flux tel quel. – Torp

Répondre

0

Je pense que vous n'utilisez pas le modèle de ViewHolder pour listview. Dans ce cas, vous êtes supposé obtenir une telle erreur que tous les éléments de la liste seront disponibles dans la mémoire, qu'elle soit visible ou non. En utilisant la mémoire ViewHolder est affecté uniquement aux éléments qui sont visibles et sont actuellement à l'écran. ViewHolder patternincreses la performance de 150% Pour didacticiel vidéo sur ViewHolder consultez this .Si vous déjà mis en place, alors il est le cas de fuite de mémoire, vous pouvez consulter this