how to solve OutOfMemoryError in android?

徘徊边缘 提交于 2020-01-13 11:45:14

问题


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.


回答1:


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
  }
 }



回答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




回答3:


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.




回答4:


you can use this to free memory:

system.gc();


来源:https://stackoverflow.com/questions/9581456/how-to-solve-outofmemoryerror-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!