Анимация Drawable вызывает ошибку OutOfMemoryError при втором запуске в Android

Я сейчас разрабатываю игру и пытаюсь использовать один AnimationDrawable, чтобы показать одну анимацию в моем главном меню. Когда я запускаю игру один раз, она работает отлично. Но если я нажму кнопку «Назад», когда я снова открою игру, у меня появится OutOfMemorryError. Если я нажму кнопку «Домой» и вернусь в игру, она загрузится, но не покажет анимацию, она будет пустой там, где должна быть.

Я думаю, когда он снова открывает игру, он пытается загрузить анимацию, но она уже загружена из предыдущего запуска, могу ли я как-нибудь освободить эту память? Как я могу обработать это исключение?

Пытаясь найти, я обнаружил, что это обычная проблема для Android, но не нашел ничего полезного.

Если это уместно, мои изображения имеют размер 310x316 и у меня 114 кадров для загрузки, анимация загружается в xml.

Мой класс MainMenu:

public class MainMenuActivity extends Activity{

 private String TAG = MainMenuActivity.class.getSimpleName();
 ImageView rabbitMenu ;
 AnimationDrawable ad;   

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);               
        setContentView(R.layout.mainmenu);          
        rabbitMenu = (ImageView) findViewById(R.id.rabbitMenu);
        rabbitMenu.setImageResource(R.drawable.rabbit_menu_animation);
        ad = (AnimationDrawable) rabbitMenu.getDrawable();

    }

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);       
        ad.start();     

}
}

Журнал ошибок:

01-31 16:13:11.320: E/AndroidRuntime(19550): FATAL EXCEPTION: main
01-31 16:13:11.320: E/AndroidRuntime(19550): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-31 16:13:11.320: E/AndroidRuntime(19550):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-31 16:13:11.320: E/AndroidRuntime(19550):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:563)
01-31 16:13:11.320: E/AndroidRuntime(19550):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)

Изменить:

После предложения @OleGG и теперь второй запуск проходит нормально, но на третьем прогоне я, по-видимому, пытаюсь использовать переработанное растровое изображение.

Поэтому я отказался от AnimationDrawable и использовал AsncTask для решения своей проблемы. Теперь я продолжаю менять фон ImageView в моем onProgressUpdate ().Возможно, это не лучший подход, но теперь у меня нет проблем! Вот мой код AsyncTask на случай, если у кого-то такая же проблема!

private class DrawRabbit extends AsyncTask<Void, Integer, Void> {
         private boolean running = true;
         private int fps = 24;
         private int frame = 10014;
         private String drawableName; 
         @Override
         protected Void doInBackground(Void... params) {


             while (running){
                 try {  
                    if (frame == 10014)
                        Thread.sleep(1000);
                    else 
                        Thread.sleep(fps);
                    if (frame < 10160) { 
                        frame++;
                        publishProgress(frame);
                    }
                    else 
                        running = false;

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }               
             return null;
         }

         protected void onProgressUpdate(Integer... frame) {
             drawableName = "rm" + frame[0];
             int res_id = getResources().getIdentifier(drawableName, "drawable", getPackageName());          
             rabbitFrame.setBackgroundResource(res_id);
         }   
     }
9
задан caiocpricci2 2 February 2012 в 03:43
поделиться