title: Out Of Memory Error with images
body: <p>i am displaying images in listview and getting out of memory error any one guide me what is the solution to this problem here is my code</p>
  
  <p>LogCat</p>
  
  <pre><code>ERROR/AndroidRuntime(1010): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  ERROR/AndroidRuntime(1010):     at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
  ERROR/AndroidRuntime(1010):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:405)
  ERROR/AndroidRuntime(1010):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418)
  ERROR/AndroidRuntime(1010):     at com.Adapters.AdapterTours.getView(AdapterTours.java:73)
  ERROR/AndroidRuntime(1010):     at android.widget.AbsListView.obtainView(AbsListView.java:1409)
  ERROR/AndroidRuntime(1010):     at android.widget.ListView.makeAndAddView(ListView.java:1745)
  ERROR/AndroidRuntime(1010):     at android.widget.ListView.fillUp(ListView.java:700)
  ERROR/AndroidRuntime(1010):     at android.widget.ListView.fillGap(ListView.java:646)
  ERROR/AndroidRuntime(1010):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3399)
  ERROR/AndroidRuntime(1010):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:2233)
  ERROR/AndroidRuntime(1010):     at android.widget.ListView.onTouchEvent(ListView.java:3446)
  ERROR/AndroidRuntime(1010):     at android.view.View.dispatchTouchEvent(View.java:3885)
  ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
  ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
  ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
  ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
  ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
  ERROR/AndroidRuntime(1010):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691)
  ERROR/AndroidRuntime(1010):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
  ERROR/AndroidRuntime(1010):     at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
  ERROR/AndroidRuntime(1010):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675)
  ERROR/AndroidRuntime(1010):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194)
  ERROR/AndroidRuntime(1010):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1878)
  ERROR/AndroidRuntime(1010):     at android.os.Handler.dispatchMessage(Handler.java:99)
  ERROR/AndroidRuntime(1010):     at android.os.Looper.loop(Looper.java:130)
  ERROR/AndroidRuntime(1010):     at android.app.ActivityThread.main(ActivityThread.java:3683)
  ERROR/AndroidRuntime(1010):     at java.lang.reflect.Method.invokeNative(Native Method)
  ERROR/AndroidRuntime(1010):     at java.lang.reflect.Method.invoke(Method.java:507)
  ERROR/AndroidRuntime(1010):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  ERROR/AndroidRuntime(1010):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  ERROR/AndroidRuntime(1010):     at dalvik.system.NativeStart.main(Native Method)
  </code></pre>
  
  <p>GetView Method</p>
  
  <pre><code>public View getView(final int position, View convertView, ViewGroup parent) {
  
        ViewHolder holder;
  
        if (convertView == null) {
          convertView = mInflater.inflate(R.layout.list_tours, null);
          holder = new ViewHolder();
          holder.tourTitle = (TextView) convertView.findViewById(R.id.tourTitle);
          holder.tourIcon = (ImageView) convertView.findViewById(R.id.tourIcon);
          holder.tourDetail = (TextView) convertView.findViewById(R.id.tourDetail);
          convertView.setTag(holder);
  
        } else {
          holder = (ViewHolder) convertView.getTag();
        }
  
  
        DalTours tour = getItem(position);
  
          String tempTag = String.valueOf(tour.getId());
          holder.tourIcon.setTag(tempTag);
  
          if(tour.getImageByteArray() != null)
          {
              Bitmap image = BitmapFactory.decodeByteArray(tour.getImageByteArray(), 0, tour.getImageByteArray().length);
              holder.tourIcon.setImageDrawable(getScaledImage(image));
              image = null;
  
          }else
          {
  
  
              holder.tourIcon.setTag(tour);
              Bitmap cachedImage = ImageLoader.loadBitmap(tour,new ImageLoader.ImageCallback() {
  
                  @Override
                  public void imageLoaded(Bitmap imageBitmap, DalTours tour) {
                      ImageView image = (ImageView)listview.findViewWithTag(tour);
                       if(image != null)
                        {
  
                        try
                        {  
                            ByteArrayOutputStream stream = new ByteArrayOutputStream();
                            if(imageBitmap != null)
                            {
  
  
                                image.setImageDrawable(getScaledImage(imageBitmap));
                                imageBitmap.compress(CompressFormat.PNG, 0 ,stream);
                                byte[] bitmapdata = stream.toByteArray();
                                tours.get(position).setImageByteArray(bitmapdata);
  
  
                           }
                            stream = null;
                        }finally
                        {
  
                        }
                        }
  
                  }
              });
                holder.tourIcon.setImageDrawable(getScaledImage(cachedImage));
  
          }
  
        holder.tourTitle.setText(tours.get(position).getTitle());
        holder.tourDetail.setText(tours.get(position).getDetail());
  
        return convertView;
      }
  </code></pre>
  
  <p>image Scale Function</p>
  
  <pre><code> public Drawable getScaledImage(Bitmap actualBitmap)
      {
          BitmapDrawable bmd= null;
          if(actualBitmap != null)
          {
  
              int width = actualBitmap.getWidth();
              int height = actualBitmap.getHeight();
  
              Activity parent = (Activity)context;
              Display display = parent.getWindowManager().getDefaultDisplay(); 
              int Screenwidth = display.getWidth();
              int Screenheight = display.getHeight();
  
  
           float newWidth = (Screenwidth*35)/100;
  
           float temp = newWidth / width;
           float newHeight =  temp * height;
  
  
  
          float scaleWidth = ((float) newWidth) / width;
          float scaleHeight = ((float) newHeight) / height;
  
          Matrix matrix = new Matrix();
  
          matrix.postScale(scaleWidth, scaleHeight);
          Bitmap resizedBitmap = Bitmap.createBitmap(actualBitmap, 0, 0, 
                            width, height, matrix, true); 
  
          bmd = new BitmapDrawable(resizedBitmap);
          }
          return bmd;
  
      }
  </code></pre>
  
  <p>Image Loader Class</p>
  
  <pre><code>public  class ImageLoader {
      private static HashMap&lt;String, SoftReference&lt;Bitmap&gt;&gt; imageCache;
  
      public ImageLoader() {
          //imageCache = new HashMap&lt;String, SoftReference&lt;Bitmap&gt;&gt;();
      }
  
      public static Bitmap loadBitmap(final DalTours tour, final ImageCallback imageCallback) {
          if(imageCache == null)
              imageCache = new HashMap&lt;String, SoftReference&lt;Bitmap&gt;&gt;();
  
          if (imageCache.containsKey(tour.getImageurl())) {
              SoftReference&lt;Bitmap&gt; softReference = imageCache.get(tour.getImageurl());
              Bitmap Bitmap = softReference.get();
              if (Bitmap != null) {
                  return Bitmap;
              }
          }
          final Handler handler = new Handler() {
              @Override
              public void handleMessage(Message message) {
                  imageCallback.imageLoaded((Bitmap) message.obj, tour);
              }
          };
          new Thread() {
              @Override
              public void run() {
                  Bitmap Bitmap = loadImageFromUrl(tour.getImageurl());
                  imageCache.put(tour.getImageurl(), new SoftReference&lt;Bitmap&gt;(Bitmap));
                  Message message = handler.obtainMessage(0, Bitmap);
                  handler.sendMessage(message);
              }
          }.start();
          return null;
      }
  
      public static Bitmap loadImageFromUrl(String url) {
  
          Bitmap bm;
          try {  
  
                  URL aURL = new URL(url);  
                  URLConnection conn = aURL.openConnection(); 
  
                  conn.connect();  
                  InputStream is = null;
                  try
                  {
                   is= conn.getInputStream();  
                  }catch(IOException e)
                  {
                       return null;
                  }
  
                  BufferedInputStream bis = new BufferedInputStream(is);  
  
                  bm = BitmapFactory.decodeStream(bis);  
                  bis.close();  
                  is.close();  
  
             } catch (IOException e) {  
              return null;
             }  
  
             return  bm;
  
  
      }
  
      public interface ImageCallback {
          public void imageLoaded(Bitmap imageBitmap, DalTours tour);
      }
  }
  </code></pre>
  
  <p>any help would be apprecicated</p>