Android:位图大小超过VM预算(逐帧)

Android:位图大小超过VM预算(逐帧),android,animation,frame,android-animation,out-of-memory,Android,Animation,Frame,Android Animation,Out Of Memory,我总是犯这个错误。正如我所看到的,stackoverflow.com上已经有很多问题,但遗憾的是,我没有找到任何适合我的答案 我有60个PNG图像(总共2,5MB),我想把它放在动画中 我试过三种不同的方法 1. 2. XML 3. 通过类扩展ImageView(我将在这里展示重要的内容) 我想知道,这是否是一个框架动画甚至可以在Android中 是否有人可以选择逐帧动画?如果是,请链接到任何showcase。您将需要以某种方式回收您的图像,因为您没有足够的内存存储60幅图像 你认为你的图像加起

我总是犯这个错误。正如我所看到的,stackoverflow.com上已经有很多问题,但遗憾的是,我没有找到任何适合我的答案

我有60个PNG图像(总共2,5MB),我想把它放在动画中

我试过三种不同的方法

1. 2. XML

3. 通过类扩展ImageView(我将在这里展示重要的内容)

我想知道,这是否是一个框架动画甚至可以在Android中


是否有人可以选择逐帧动画?如果是,请链接到任何showcase。

您将需要以某种方式回收您的图像,因为您没有足够的内存存储60幅图像

你认为你的图像加起来是2,5兆,但这是你文件的压缩png版本

如果你想知道在内存中以位图格式解压时,文件使用了多少内存,只需做:宽度*高度*图像数量*每像素字节数…然后你就会知道崩溃的原因:D

AnimationDrawable不适合这种大量使用。您应该开始查看SurfaceViews,然后就可以自由地实现任何要用于显示动画的内存管理方法


祝你好运。

你需要以某种方式回收你的图像,因为你没有足够的内存存储60幅图像

你认为你的图像加起来是2,5兆,但这是你文件的压缩png版本

如果你想知道在内存中以位图格式解压时,文件使用了多少内存,只需做:宽度*高度*图像数量*每像素字节数…然后你就会知道崩溃的原因:D

AnimationDrawable不适合这种大量使用。您应该开始查看SurfaceViews,然后就可以自由地实现任何要用于显示动画的内存管理方法


祝你好运。

有时候,内存泄漏来自堆栈跟踪中显示的代码行以外的地方。我认为您应该仔细阅读下面的文章,然后检查您自己的代码以忽略一些特殊问题,例如:

  • 不要保留对上下文活动的长期引用(对活动的引用应与活动本身具有相同的生命周期)
  • 尝试使用上下文应用程序而不是上下文活动
  • 避免活动中的非静态内部类如果不控制它们的生命周期,请使用静态内部类并对内部活动进行弱引用。这个问题的解决方案是使用一个静态的内部类和外部类的WeakReference,例如在ViewRoot及其W内部类中**

编辑: 您还应检查以下各项:

  • 调用recycle()删除未使用的位图

  • 使用sampleSize>1减小位图大小

创建位图(宽度, 高度,新BitmapFactory.Options().inSampleSize=4)


有时,内存泄漏来自堆栈跟踪中显示的代码行以外的地方。我认为您应该仔细阅读下面的文章,然后检查您自己的代码以忽略一些特殊问题,例如:

  • 不要保留对上下文活动的长期引用(对活动的引用应与活动本身具有相同的生命周期)
  • 尝试使用上下文应用程序而不是上下文活动
  • 避免活动中的非静态内部类如果不控制它们的生命周期,请使用静态内部类并对内部活动进行弱引用。这个问题的解决方案是使用一个静态的内部类和外部类的WeakReference,例如在ViewRoot及其W内部类中**

编辑: 您还应检查以下各项:

  • 调用recycle()删除未使用的位图

  • 使用sampleSize>1减小位图大小

创建位图(宽度, 高度,新BitmapFactory.Options().inSampleSize=4)


60 png内存不是2,5 MB。。。png文件的宽度*高度*3(甚至4)…60 png内存中不是2,5 MB。。。png文件的宽度*高度*3(甚至4)…添加了每像素字节数部分:)不知道png的大小。。。将尝试使用SurfaceView,谢谢。@技巧:这不仅是png,而且是Android中使用的任何图形文件,它们在使用前都在内存中解压缩。添加了每像素字节数部分:)不知道png的大小。。。将尝试使用SurfaceView,谢谢。@技巧:这不仅是png,而且是Android中使用的任何图形文件,它们在使用前都会在内存中解压缩。
mAnimation = new AnimationDrawable();
mAnimation.addFrame((BitmapDrawable)getResources().getDrawable(R.drawable.yawning_00001), FPS_12);  
...
mAnimation.addFrame((BitmapDrawable)getResources().getDrawable(R.drawable.yawning_00063), FPS_12);
mAnimation.start();
<animation-list android:oneshot="true">
    <item android:drawable="@drawable/yawning_00001" android:duration="83" />
    ...
    <item android:drawable="@drawable/yawning_00063" android:duration="83" />
 </animation-list>
ImageView img = (ImageView)findViewById(R.id.animation);
img.setBackgroundResource(R.drawable.yawning);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
frameAnimation.start();
public void loadAnimation(String prefix, int nframes) {
    mBitmapList.clear();
    for (int x = 0; x < nframes; x++) {
        String zeros = "000";
        if (x < 10) {
            zeros += "0";
        }
        String name = prefix + "_" + zeros + x;
        Log.d(TAG, "loading animation frame: " + name);
        int res_id = mContext.getResources().getIdentifier(name, "drawable", mContext.getPackageName());
        d = (BitmapDrawable) mContext.getResources().getDrawable(res_id);
        mBitmapList.add(d.getBitmap());
    }
}
E/AndroidRuntime(1591): java.lang.OutOfMemoryError: bitmap size exceeds VM budget