通过AnimationDrawable播放动画时,在运行时释放内存

时间:2013-12-26 12:17:48

标签: android android-animation

我至少有<= 30张图像来制作动画。当我播放动画手机内存满载时。我在log cat中收到了一条消息,如:

    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

将堆(frag case)增长到45.700MB 。 出于这个原因,许多较低的虚拟内存设备无法运行此动画。应用程序崩溃。

我使用优化的 PNG 文件来减少运行时的VM大小。但仍然没有变化。我还在Manifest文件中写了 android:allowBackup =“true”,它有更好的帮助。我像这样播放我的动画:

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中运行应用程序 - &gt;结果没问题。但在Sony X-Peria New 我有时会遇到错误。 任何解决方案都可以在各种设备中顺利运行?

1 个答案:

答案 0 :(得分:3)

这些图片可能太大了。您将它们转换为.PNG的事实对您没有帮助,因为磁盘上的大小与消耗的内存大小无关。图像作为Bitmap对象加载。因此,假设您的图像尺寸为1,000 x 1,000像素。如果位图配置为ARGB_8888,则每个像素为4个字节。运行数学,该图像为4 MB。将30个图像乘以30个图像,然后突然看到内存所需的120 MB。

缩小图像的分辨率,或者按比例缩小图像。

largeHeap = true是真正问题的创可贴。