title: Out of memory Exception, when dealing with bitmaps
body: <p>I am working on an application where i have images being downloaded asynchronously for SlideShows. One SlideShow contains 10 slides, hence 10 images are downloaded when slideshow is opened. After i scroll through 10-15 slideshows approximately i start getting memory warning and following Exception in the trace and app crashes. </p>
  
  <p>Here is the trace:</p>
  
  <pre><code>12-23 12:23:53.124: ERROR/dalvikvm-heap(3067): 45850-byte external allocation too large for this process.
  12-23 12:23:53.134: ERROR/dalvikvm(3067): Out of memory: Heap Size=13127KB, Allocated=11913KB, Bitmap Size=11407KB
  12-23 12:23:53.134: ERROR/GraphicsJNI(3067): VM won't let us allocate 45850 bytes
  12-23 12:23:53.134: DEBUG/skia(3067): --- decoder-&gt;decode returned false
  12-23 12:23:53.134: WARN/dalvikvm(3067): threadid=46: thread exiting with uncaught exception (group=0x400259f8)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067): FATAL EXCEPTION: Thread-1016
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:468)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:332)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at com.nbcu.myApp.appsupport.AsyncImageLoader.loadImageFromUrl(AsyncImageLoader.java:98)
  12-23 12:23:53.134: ERROR/AndroidRuntime(3067):     at com.nbcu.myApp.appsupport.AsyncImageLoader$2.run(AsyncImageLoader.java:70)
  12-23 12:23:53.154: WARN/ActivityManager(96):   Force finishing activity com.nbcu.myApp.activities/com.nbcu.myApp.controllers.StoriesListController
  12-23 12:23:53.224: ERROR/dalvikvm-heap(3067): 45850-byte external allocation too large for this process.
  12-23 12:23:53.234: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x2fabc0), pid=96, w=1, h=1
  12-23 12:23:53.234: ERROR/dalvikvm(3067): Out of memory: Heap Size=13127KB, Allocated=11948KB, Bitmap Size=11407KB
  12-23 12:23:53.234: ERROR/GraphicsJNI(3067): VM won't let us allocate 45850 bytes
  12-23 12:23:53.234: ERROR/Error(3067): Message = java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  </code></pre>
  
  <p>The code where images are being downloaded is:</p>
  
  <pre><code>public void run() {
  
          Looper.prepare();
          for (int i = 0; i &lt; slides.size(); i++) {
              try {
  
                  final SlideShowItem story = slides.get(i);
                  if (story.getImage() == null) {
                      Drawable cachedImage = Utils.database.getRSSImage(Constants.StoriesTable, story.getItemId());
  
                      if (cachedImage != null) {
                          story.setImage(cachedImage);
  
                      } else {
                          cachedImage = asyncImageLoader.loadDrawable(story.getImagePath(), new ImageCallback() {
                              public void imageLoaded(Drawable imageDrawable, String imageUrl) {
  
  
                                  story.setImage(imageDrawable);
                                  Utils.database.storeRSSItemImage(Constants.StoriesTable, imageDrawable, story.getItemId());
                              }
                          });
                      }
                  }
  
                  Thread.sleep(500);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          Looper.loop();
      }
  </code></pre>
  
  <p>Code for loadDrawable() is:</p>
  
  <pre><code>public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
  
      final Handler handler = new Handler() {
  
          public void handleMessage(Message message) {
  
              imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
          }
      };
      new Thread() {
  
          public void run() {
  
                  Drawable drawable = loadImageFromUrl(imageUrl);
                  // System.out.println("image url: " + imageUrl);
                  if (drawable != null)
                  {
                      Message message = handler.obtainMessage(0, drawable);
                      handler.sendMessage(message);
                  }
          }
  
      }.start();
      return null;
  }
  </code></pre>
  
  <p>and the code for loadImageFromURL() is:</p>
  
  <pre><code>  public static Drawable loadImageFromUrl(String url) {
  
      Drawable image = null;
  
      try {
          InputStream in = (java.io.InputStream) new java.net.URL(url).getContent();
          if (in != null) {
              image = Drawable.createFromStream(in, "image");
          }
          in.close();
  
      } catch (Exception ex) {
          // ex.printStackTrace();
          Log.v("Exception ", "Asyn Image.In LoadImageFromURL Message: " + ex.toString());
  
      }
      return image;
  }
  </code></pre>
  
  <p>Once images are downloaded they are cached. I am unable to find a workaround to avoid this exception. what could be the reason? I have also tried setting image views null when activity is destroyed but it has done nothing for me? Any help is appreciated. Thanks in advance. </p>