动画仅使用少量图像导致内存错误

时间:2013-02-20 09:21:04

标签: android image memory

我在同一个活动中开始2 AnimationDrawable,我遇到内存错误。这是非常令人惊讶的,因为我减小了图像的大小(宽度=屏幕的宽度),我不能减少它,因为质量会降低。例如,如果我做宽度=屏幕宽度/ 2,它会颤动,但质量很差。

在logcat中写道:

02-19 10:56:44.769: E/dalvikvm-heap(3118): 383916-byte external allocation too large for this process.
02-19 10:56:44.809: E/GraphicsJNI(3118): VM won't let us allocate 383916 bytes
02-19 10:56:44.809: W/dalvikvm(3118): threadid=1: thread exiting with uncaught exception (group=0x40018560)
02-19 10:56:44.819: E/AndroidRuntime(3118): FATAL EXCEPTION: main
02-19 10:56:44.819: E/AndroidRuntime(3118): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我不认为我有内存泄漏,但检查this article,我试图检测到潜在的内存泄漏,但在我看来没有。

我真的需要一些帮助,因为这不是我在这个项目中的第一个内存错误,而且我总是很难处理它。

这是我的代码:

private void startAnimation(AnimationDrawable animation1,
        AnimationDrawable animation2) {
    int drawables[] = new int[] { R.drawable.fire1, R.drawable.fire2,
            R.drawable.fire3, R.drawable.fire4, R.drawable.fire5,
            R.drawable.fire6, R.drawable.fire7, R.drawable.fire8,
            R.drawable.fire9, R.drawable.fire10down2,
            R.drawable.fire11down2, R.drawable.fire12down2,
            R.drawable.fire13down2, R.drawable.fire14down2,
            R.drawable.fire15down2, R.drawable.fire16down2 };
    int drawables2[] = new int[] { R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire10up, R.drawable.fire11up, R.drawable.fire12up,
            R.drawable.fire13up, R.drawable.fire14up, R.drawable.fire15up,
            R.drawable.fire16up };
    bitmapDrawable = new BitmapDrawable[drawables.length];
    bitmapDrawable2 = new BitmapDrawable[drawables2.length];
    for (int i = 0; i < drawables.length; i++) {
        bitmapDrawable[i] = new BitmapDrawable(
                decodeSampledBitmapFromResource(getResources(),
                        drawables[i], width));
        Log.w("BITMAP", "i=" + i);
        bitmapDrawable2[i] = new BitmapDrawable(
                decodeSampledBitmapFromResource(getResources(),
                        drawables2[i], width));
        animation1.addFrame(bitmapDrawable[i], 50);
        animation2.addFrame(bitmapDrawable2[i], 50);
    }
    animation1.setOneShot(true);
    animation2.setOneShot(true);
    image2.setLayoutParams(params);
    image2.setImageDrawable(animation1);
    image2.post(new Starter(animation1));
    image3.setLayoutParams(params);
    image3.setImageDrawable(animation2);
    image3.post(new Starter(animation2));
}

class Starter implements Runnable {

    AnimationDrawable animation = new AnimationDrawable();

    public Starter(AnimationDrawable animation) {
        this.animation = animation;
    }

    public void run() {
        animation.start();
    }
}

如何减轻位图的重量(如果有必要?问题可能在其他地方 - 并保持图像的质量?我没有看到问题所在,我只使用30张图像,其他应用程序使用更多!还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

降低质量无济于事,因为如果您要使用整个屏幕尺寸的图像进行动画制作,那么您(在大多数情况下)会超出设备的内存。

我对动画做的是我:

  • 使用恒定的背景图像。
  • 提取动画中不断变化的小区域
  • 制作动画中改变的独立小图像
  • 使用具有恒定背景图像的小图像进行动画