title: Android outofmemory error bitmap size exceeds vm budget in 2.3.3
body: <p>I understand that this question is asked few times. None of them is clear on the solution. Let me explain the problem. </p>
  
  <ol>
  <li>I have an Activity which loads 4 images at a time. </li>
  <li>I load the images in the onResume() method. </li>
  <li>The Activity throws bitmap error when loading. </li>
  </ol>
  
  <p>Notes. </p>
  
  <ol>
  <li>I am setting image using setImageResource(R.drawable.xxxx) method call and not bitmap/drawables directly. </li>
  <li>The images are scaled correctly. </li>
  <li>The activtiy WORKS FINE in all emulators prior to 2.3 and is WORKING FINE in Actual device (Samsung Galaxy 5)</li>
  <li>The error is appearing on first initialisation and no orientation change event is fired. </li>
  <li>images are 800 x 600 in scale and averages 15kb(each) in size.</li>
  </ol>
  
  <p>Let me know any solutions. Also let me know if you have similar issues with Android 2.3.3 emulator. </p>
  
  <p>[update] -snippets</p>
  
  <pre><code>public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
              ...
      img_topLeft = (ImageView) findViewById(R.id.Img_Alph_Q_TopLeft);
      img_topRight = (ImageView) findViewById(R.id.Img_Alph_Q_TopRight);
      img_bottomLeft = (ImageView) findViewById(R.id.Img_Alph_Q_BottomLeft);
      img_bottomRight = (ImageView) findViewById(R.id.Img_Alph_Q_BottomRight);
     ...
     }
  protected void onResume() {
      super.onResume();
              img_topLeft.setImageResource(R.drawable.xxx);
              img_topRight.setImageResource(R.drawable.xxx);
              img_bottomLeft.setImageResource(R.drawable.xxx);
              img_bottomRight.setImageResource(R.drawable.xxx);
     ...
     }
  </code></pre>
  
  <blockquote>
    <p>03-21 08:59:17.362: ERROR/dalvikvm-heap(5883): 4320000-byte external allocation too large for this process.
    03-21 08:59:17.412: ERROR/GraphicsJNI(5883): VM won't let us allocate 4320000 bytes
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883): FATAL EXCEPTION: main
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.Bitmap.nativeCreate(Native Method)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.content.res.Resources.loadDrawable(Resources.java:1709)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.content.res.Resources.getDrawable(Resources.java:581)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.widget.ImageView.resolveUri(ImageView.java:501)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.widget.ImageView.setImageResource(ImageView.java:280)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at Quiz.java:124)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     Quiz.onResume(Quiz.java:92)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.Activity.performResume(Activity.java:3832)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.os.Looper.loop(Looper.java:123)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at android.app.ActivityThread.main(ActivityThread.java:3683)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at java.lang.reflect.Method.invoke(Method.java:507)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    03-21 08:59:17.432: ERROR/AndroidRuntime(5883):     at dalvik.system.NativeStart.main(Native Method)</p>
  </blockquote>
  
  <p><strong>Thanks. Managed to resolve it. Sharing the code for benefit of others
  Custom class that resolved this issue. based on @Janardhanan.S link.</strong></p>
  
  <pre><code>public class BitmapResizer {
  
  public static Bitmap decodeImage(Resources res, int id ,int requiredSize){
      try {
          BitmapFactory.Options o = new BitmapFactory.Options();
          o.inJustDecodeBounds = true;
          BitmapFactory.decodeResource(res, id, o);
  
          //Find the correct scale value. It should be the power of 2.
          final int REQUIRED_SIZE=requiredSize;
          int width_tmp=o.outWidth, height_tmp=o.outHeight;
          int scale=1;
          while(true){
              if(width_tmp/2&lt;REQUIRED_SIZE || height_tmp/2&lt;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.decodeResource(res, id, o2);
      } catch (Exception e) {
  
      }
      return null;
  }
  
  }
  
  //Class call
  int requiredsize = 100; // Still playing around with this number to find the optimum value
  img_topLeft.setImageBitmap(BitmapResizer.decodeImage(getResources(),
          AlphResourceSet.R.drawable.xxx, requiredsize));
  </code></pre>