Outofmemory error bitmap for Android exceeds vm budget in 2.3.3

I understand that this question is asked several times. None of them are clear from the solution. Let me explain the problem.

  • I have an Activity that uploads 4 images at a time.
  • I upload images to the onResume () method.
  • When loading Activity gives an error of the raster image.

Notes.

  • I set the image using the setImageResource (R.drawable.xxxx) method, not bitmap / drawables.
  • Images are scaled correctly.
  • The WORKS FINE activity in all emulators is up to 2.3 and is the WORKING PART in a real device (Samsung Galaxy 5).
  • The error appears during the first initialization, and the orientation change event does not start. Images
  • They have a size of 800 x 600 and average values โ€‹โ€‹of 15kb (each).

Let me know any solutions. Also let me know if you have similar problems with Android 2.3.3 emulator.

[update] -snippets

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); ... } 

03-21 08: 59: 17.362: ERROR / dalvikvm-heap (5883): external allocation of 4320000 bytes is too large for this process. 03-21 08: 59: 17.412: ERROR / GraphicsJNI (5883): VM will not allow us to 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: the size of the bitmap exceeds the budget VM 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.javahaps49) 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.javarige73) 03-21 08: 59: 17.432: ERROR / AndroidRuntime (5883): at android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.javahaps36) 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.javacla81) 03-21 08: 59: 17.432: ERROR / AndroidRuntime (5883): on android.widget.ImageView.resolveUri (ImageView.javaโ–บ01) 03-21 08: 59: 17.432: ERROR / AndroidRuntime (5883): on 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 (58 83): at android.os.Looper.loop (Looper.java:123) 03-21 08: 59: 17.432: ERROR / AndroidRuntime (5883): at android.app.ActivityThread.main (ActivityThread.javahaps683) 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โˆ—97) 03-21 08: 59: 17.432: ERROR / AndroidRuntime (5883): at dalvik.system.NativeStart.main (native method)

Thanks. I managed to solve the problem. Code sharing for others A custom class that resolved this issue. based on @ Janardhanan.S.

 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<REQUIRED_SIZE || height_tmp/2<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)); 
+7
source share
3 answers

A bitmap consumes a lot of memory space. do not create a new bitmap variable for the entire image that you upload to activity, instead you can create one bitmap variable and reuse them as much as you can.

you can use this snippet to resize the bitmap

http://pastebin.com/D8vbQd2u

+3
source

Can you post the Activity + stacktrace code snippet.

Have you checked Avoid articles about memory leaks ?

In particular, the following part:

When a Drawable is attached to a view, the view is set as a callback to drawable. In the code snippet above, this means that drawable has a link to a TextView, which itself has a link to activity (Context), which in turn has links to almost anything (depending on your code.)

0
source

The images seem to be very heavy in nature. I recommend running AsyncTimer, which actually returns a bitmap instance, and in doBackground () in asyncTask passes the image ID and scales it to the desired size, say 32 x 32 using the createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) method createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) of the Bitmap class.

0
source

All Articles