动画加载时会出现java.lang.OutOfMemoryError吗?

时间:2013-11-28 11:06:22

标签: android android-animation android-memory animationdrawable

我从开发者网站获得的是“如果在加载时动画的总大小超过虚拟堆内存的值,则会发生此错误”,对于解决方案,请使用BitmapFactory。我试过以下代码:

现在问题是,“这个错误的原因是什么?”

  1. 当图像加载动画时,是否计算图像的尺寸。

    赞:如果我有10个图像尺寸(1100 * 1100)并使用ARGB_8888图案作为图像。

  2. 图像尺寸(500KB,1MB等)对此错误也很重要。

  3. 或者两者都对此错误负责。

  4. 如果我在单个活动上使用多个动画而不是change this Activity to another Activity,如何通过AnimationDrawable释放我在上一个活动中使用的所有内存?

  5. 欢迎所有建议。谢谢

    代码

    public class AdActivity extends Activity {
    
    ImageView iView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ad);
    
        iView = (ImageView) findViewById(R.id.iView);
    
        //iView.setBackgroundResource(R.drawable.anim); // ( 1 )
    
        try{ 
                 //  (2)
            iView.setImageBitmap(decodeSampleBitmapFromResource(getResources(), R.drawable.anim, 100, 100));
    
            AnimationDrawable frameAnimation = (AnimationDrawable) iView.getBackground();
            frameAnimation.start();
        }
        catch(Exception e){
        }
    }
    
    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
    
        if (height > reqHeight || width > reqWidth) {
    
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
    
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
    
        return inSampleSize;
    }
    
    public static Bitmap decodeSampleBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
    
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
    
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }
    
    }
    

    两件事:

    1. 我在(1)中提到注释时,这是在ImageView中获取动画的简单方法,但在这种情况下,启动应用程序时使用的toatal大小约为44MB。 '运行完美'

    2. 我在试用中提到(2),这是由Android开发者网站here提供的解决方案。

    3. 我没有尝试过错误,当App运行但是动画没有在ImageView中显示时,尺寸是apporox 11Mb。

      请告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

你可以通过1)增加你的dalvik堆大小来解决你的错误:清单文件中的bigheap =“true”

2)如果您重复使用解码图像,则需要实施Lrucache

3)每当你使用decodeSampleBitmapFromResource()解码任何图像时,它的refences都存储在本机堆中。可以通过System.gc()清除它来回收内存,但我们不能依赖它,因为它是由OS决定的何时释放它。

4)如果你想清除本机堆,你应该在NDK中编写代码

答案 1 :(得分:0)

您是否检查了inSampleSize的值?

options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

您可以保存位图参考,并在onPause中回收位图。 你只需设置一个图像,你怎么看动画?请参阅AnimationDrawable。这个动画由多帧组成。