Я сейчас занимаюсь разработкой игры и пытаюсь использовать один 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)
Edit:
После предложения @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);
}
}