2013-12-26 6 views
3

У меня есть как минимум < = 30 изображений для создания анимации. Когда я полностью загрузил память анимации телефона. Я получил сообщение в журнале кошке, как:Освободить память во время выполнения, когда анимация воспроизводится через AnimationDrawable

12-26 18:01:48.335: D/dalvikvm(7385): GC_FOR_ALLOC freed 257K, 5% free 44870K/47175K, paused 16ms, total 16ms 
12-26 18:01:48.340: I/dalvikvm-heap(7385): **Grow heap (frag case) to 45.700MB** for 1048592-byte allocation 
12-26 18:01:48.355: D/dalvikvm(7385): GC_FOR_ALLOC freed <1K, 5% free 45894K/48263K, paused 15ms, total 15ms 

Grow кучи (осколочный случай) к 45.700MB. По этой причине многие устройства с более низкой виртуальной памятью не могут запускать эту анимацию. & приложение получает сбой.

Я использую оптимизированный файл PNG, чтобы уменьшить размер виртуальной машины во время выполнения. Но все равно никаких изменений. Я также написал андроид: allowBackup = "true" в Manifest File, это помогает намного лучше. Я играю свою анимацию, как это:

private AnimationDrawable independentAnimation; 

imageViewAnimation = (ImageView) findViewById(R.id.imageViewAnimation); 
      // set the animation drawable as background 
      imageViewAnimation 
        .setBackgroundResource(R.drawable.demo_logo_animation); 
      // create an animation drawable using the background 
      independentAnimation = (AnimationDrawable) imageViewAnimation 
        .getBackground(); 


      // start the animation 
      imageViewAnimation.post(new Runnable() { 

       @Override 
       public void run() { 
        // for 2.3 devices & All runs well 
        independentAnimation.start(); 
       } 
      }); 

Обязательно анимация demo_logo_animation.xml выглядит: парциальное:

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true" > 

    <item 
     android:drawable="@drawable/itv001" 
     android:duration="@string/log_in_duration"/> 

    <item 
     android:drawable="@drawable/itv003" 
     android:duration="@string/log_in_duration"/> 
    <!-- <item --> 
    <!-- android:drawable="@drawable/logoani256_00004" --> 
    <!-- android:duration="25"/> --> 
    <!-- <item --> 

    <!-- android:drawable="@drawable/logoani256_00005" --> 
    <!-- android:duration="25"/> --> 
    <item 
     android:drawable="@drawable/itv006" 
     android:duration="@string/log_in_duration"/> 

<!-- remaining are here --> 
    </animation-list> 

я запустить приложение в Samsung Galaxy S3 -> не приводит никаких проблем. Но в Sony X-Peria New у меня иногда возникали ошибки. Любое решение для бесперебойной работы в виде устройств?

+0

Попробуйте добавить android: largeHeap = "true" в вашем манифесте. – nikvs

+0

уже использовать @nikvs :) –

+0

Проверить доступную память перед запуском анимации – nikvs

ответ

3

Эти изображения, вероятно, слишком велики. Тот факт, что вы преобразовали их в .PNG, не поможет вам, потому что размер на диске не имеет ничего общего с размером в потребляемой памяти. Изображения загружаются как объекты Bitmap. Итак, скажем, у вас было изображение размером 1000 х 1000 пикселей. Если битмап настроен как ARGB_8888, это будет 4 байта на пиксель. Запустите математику и это 4 МБ для этого изображения. Умножьте это время на 30 изображений и внезапно вы смотрите на 120 МБ, необходимые для памяти.

Либо уменьшайте разрешение изображений вниз, либо уменьшайте их.

largeHeap = true - полоса для реальной проблемы.

+0

Как установить Bitmap с ARGB_8888 или другим? Каждое из моих изображений - 256 * 256 пикселей, размер 5 ~ 7 КБ. –

+0

@shihab_returns Не совсем. Если изображение загружается по умолчанию как ARGB_8888, тогда это будет 256 * 256 * 4, что составляет 262 КБ. См. Эту ссылку: http: //developer.android.com/training/displaying-bitmaps/load-bitmap.html И эта ссылка: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferredConfig –

Смежные вопросы