2011-09-12 108 views
1

在我的应用程序中,我从网上下载图像。为此,我第一次从网上下载图像,这些图像存储在SD卡中。下次,我正在检查这些图像是否在SD卡中。如果是的话,从SD卡获取,否则我从网上下载。这些图像显示为列表。我反复(意味着不断上移/下移)滚动列表,然后我的应用程序崩溃,我得到了内存不足的例外。如何处理它。有谁能够帮助我。android-内存不足问题

堆栈跟踪:

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 

代码

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

降低图像的大小,并尝试 – Abhi

+0

在这里,我的情况下我压缩图像是不够的,那么如何减小尺寸? – naresh

+0

你似乎将它们解压缩到内存中,然后在保存中重新压缩它们......也许跳过并按原样保存流。 – Torp

回答

0

我想你不使用ViewHolder模式的列表视图。在这种情况下,你应该得到这样的错误,因为所有的列表项都可以在内存中看到,不管它是否可见。通过使用ViewHolder,内存只被分配给那些可见和当前在屏幕上的项目。 ViewHolder patternincreses 150%的性能 有关ViewHolder视频教程退房this。如果你已经实现,那么它是内存泄漏的可以参考this