В настоящее время я разрабатываю игру, и я пытаюсь использовать один AnimationDrawable, чтобы показать одну анимацию в главном меню. Когда я запускаю игру один раз, она отлично работает. Но если я нажму кнопку «Назад», когда я снова открою игру, она даст мне OutOfMemorryError. Если я попаду домой и вернусь к игре, она загрузится, но не покажет анимацию, она пуста, где она должна быть.Анимация Drawable вызывает OutOfMemoryError при втором запуске в Android
Я думаю, что когда он снова откроет игру, он попытается загрузить анимацию, но она уже загружена из предыдущего запуска, могу ли я как-то освободить эту память? Как я могу обработать это исключение?
Поиск вокруг, я могу обнаружить, что это общая проблема в 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);
}
}
Так что это 300x300x4, около 360k на изображение. Я не уверен, как анимация управляет памятью каждого фрейма, но если для очистки памяти требуется немного времени, неудивительно, что она быстро исчерпала ее. – dmon
Я создал класс для отображения анимаций из чертежей: http://stackoverflow.com/a/12519216/525319 – Yar
Вы спасли мне много времени, спасибо – raja