SuReSh PaTi
SuReSh PaTi

Reputation: 1371

how to solve OutOfMemoryError in android?

I have prepared no.of drawable animations.when application launch first animation will be start.i have two buttons(next and previous) with same activity.when i click on next button i got exception like,

 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

My code is,

For getting drawable animations from drawable,

private void getAnimationForLetters(int mAnim) {
        // TODO Auto-generated method stub
        String anim = "capital_anim_" + new Integer(mAnim).toString();

        final int resID = getApplicationContext().getResources().getIdentifier(
                anim, "drawable", "my-package-name");
        mImgLetter.clearAnimation();
        mImgLetter.setBackgroundResource(resID);
        mImgLetter.post(new Runnable() {

            public void run() {
                loadingAnimation = (AnimationDrawable) mImgLetter
                        .getBackground();
                loadingAnimation.start();
            }
        });

    }

my next button code is,

case R.id.btnNext_:
 unbindDrawables(findViewById(R.id.imgLetter));
mLetterNum=mLetterNum+1;
getAnimationForLetters(mLetterNum);

my undind drawable method code is,

private void unbindDrawables(View view) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }

finally i got exception java.lang.OutOfMemoryError: bitmap size exceeds VM budget It is showing exception here mImgLetter.setBackgroundResource(resID); Please help me.

I have added following code to clear,

loadingAnimation.stop();
        for (int i = 0; i < loadingAnimation.getNumberOfFrames(); ++i){
            Drawable frame = loadingAnimation.getFrame(i);
            if (frame instanceof BitmapDrawable) {
                ((BitmapDrawable)frame).getBitmap().recycle();
            }
            frame.setCallback(null);
        }
        loadingAnimation.setCallback(null);

It is working fine for only next or previous.First time click on next animation move to second animation,second time if i click on previous button i got exception like,

Canvas: trying to use a recycled bitmap android.graphics.Bitmap

please help me.

Upvotes: 4

Views: 7376

Answers (4)

Martin
Martin

Reputation: 4816

exactly - the system knows when to collect garbage, so calling that doesn't help in the least.

You have to really really manage your apps memory. 290x330 may not seem like much, but if you're using full RGBA that's 4 bytes per pixel and your image turns into 380K. If you have several of these you're going to run out of memory. Most Android devices are not like PCs - they have rather limited memory. Some have only 16M or 24M to run everything, including the OS and any other apps the user might be running concurrently.

You might try wrapping your routine to load resources with try/catch

 While( ! success ) {
   try {
       // load resources
  }  catch (OutOfMemoryError E) { 
       // do something to use less memory and try again
  }
 }

Upvotes: 3

Deva
Deva

Reputation: 3949

Look at the below link the out of memory has been discussed in detail.

Android Out of memory issue

For me Thomas's solution has worked in past.

Hope it helps.

Upvotes: 0

Sunil_Suthar
Sunil_Suthar

Reputation: 1094

you can use this to free memory:

system.gc();

Upvotes: -2

Sai mukesh
Sai mukesh

Reputation: 722

It may happen if you use high resolution images for mobiles with less resolution and memory. Make use Drawable-hdpi, Drawable-mdpi, Drawable-ldpi folders and place your images with suitable resolution.

FYI.. mostly you may also see this error in emulator when heapSize is too less. Try to increase heap size using AVD manager

This link might help you Supporting multiple screen resolutions

Upvotes: 2

Related Questions