Android: исключение из памяти при загрузке анимации

#android #animation #out-of-memory

#Android #Анимация #нехватка памяти

Вопрос:

Я делаю все довольно просто, но у меня много кадров. Похоже, что исключение вызывает количество кадров. Я попытался уменьшить размер каждого кадра, но, похоже, это не сильно влияет. Это происходит еще до начала анимации. Что можно сделать, если не показывать меньше кадров? Есть ли другой подход?

Адаптировано из примера кода:

 public class XMLAnimation extends Activity
{
    class MyAnimationRoutine extends TimerTask
    {
        MyAnimationRoutine()
        {
        }

        @Override
        public void run()
        {
            ImageView img = (ImageView) findViewById(R.id.simple_anim);
            AnimationDrawable frameAnimation = (AnimationDrawable) img
                    .getBackground();

            frameAnimation.start();
        }
    }

    class MyAnimationRoutine2 extends TimerTask
    {
        MyAnimationRoutine2()
        {
        }

        @Override
        public void run()
        {
            ImageView img = (ImageView) findViewById(R.id.simple_anim);
            AnimationDrawable frameAnimation = (AnimationDrawable) img
                    .getBackground();

            frameAnimation.stop();
        }
    }

    @Override
    public void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        ImageView img = (ImageView) findViewById(R.id.simple_anim);
        img.setBackgroundResource(R.anim.simple_animation);

        MyAnimationRoutine mar = new MyAnimationRoutine();
        MyAnimationRoutine2 mar2 = new MyAnimationRoutine2();

        Timer t = new Timer(false);
        t.schedule(mar, 100);
        Timer t2 = new Timer(false);
        t2.schedule(mar2, 5000);
    }
}
  

макет:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
      <ImageView android:id="@ id/simple_anim"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center"
          android:layout_centerHorizontal="true"
           /> 
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Hello World, XMLAnimation"
    />
</LinearLayout>
  

список анимации:

 <?xml version="1.0" encoding="utf-8"?>
 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" id="selected" android:oneshot="false">
    <item android:drawable="@drawable/frame1" android:duration="50" />
    ...
    <item android:drawable="@drawable/frame40" android:duration="50" />
 </animation-list>
  

Комментарии:

1. Почему существует 2 класса для одной анимации?

2. Дополнительные вспомогательные классы предназначены для уменьшения полезной нагрузки в основном потоке. Для этого есть много разных способов. Есть несколько дискуссий о правильном / наилучшем способе решения этой проблемы.

Ответ №1:

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

Так что, иногда, просто начать заново получается.