4

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.

SuReSh PaTi
  • 1,373
  • 7
  • 28
  • 46

4 Answers4

3

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
  }
 }
Martin
  • 4,711
  • 4
  • 29
  • 37
2

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

Sai mukesh
  • 712
  • 3
  • 9
0

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.

Community
  • 1
  • 1
Deva
  • 3,919
  • 1
  • 27
  • 38
-2

you can use this to free memory:

system.gc();
Sunil_Suthar
  • 1,094
  • 1
  • 10
  • 20
  • 1
    It does not call the GarbageCollector! It just says "it would be cool if the GarbageCollector can perform checks now" – Sly Mar 06 '12 at 10:32