如何在不耗尽内存或使用非常小的图像的情况下加载多个AnimationDrawable?

时间:2013-06-05 05:35:55

标签: java android performance-testing

我现在正在编写一个应用程序,它使用占据大部分屏幕的四个主要按钮。每个都有三个动画:一个12帧的介绍动画,一个33帧的循环动画,以及一个基于当前帧点击循环关闭的动画。

高约250 250至450 250左右的图像。 在应用程序加载时加载所有这些不仅导致初始加载缓慢,而且还导致可用内存较小的设备上的内存不足例外。

问题在于,当我尝试加载动画而不预先加载动画时,它会在加载之前跳过并挂起一秒钟。此外,我注意到,即使只是在每个点击监听器需要它们时运行活动动画,内存使用量似乎也在20mb到40mb之间。

我实际上并没有做任何奇怪的实施。我使用标准

AnimationDrawable animation = (AnimationDrawable)getResources().getDrawable(R.drawable.blah);
imageView.setImageDrawable(animation);
animation start;

然后根据需要加载单个动画而不预加载会稍微延迟。有没有办法预先加载它们(如果这有意义)或者在我如何在代码中实现它们方面做其他事情?我目前正致力于将动画切割成不同的部分,因此唯一更改的帧是动画对象的实际部分。

除此之外,我还能如何处理AnimationDrawable和内存?似乎动画对于Android来说是如此基础,必须有更好,专业的方式来处理动画资源,这样它们就不会破坏内存库并且仍然不稳定。请让我知道我这样做是愚蠢的。我应该使用不同的动画类,还是手动将更改为基于计时器的动画视图分配,这样我一次只能加载一个?

我想这是一个混乱的问题 - 看起来似乎必须有一种处理这类问题的标准方法。减帧?不同格式的图片? (jpg和png是一样的)

2 个答案:

答案 0 :(得分:1)

您可以做几件事来减少内存消耗。

  • 将图像重新调整为精确的按钮大小。你不需要更大的图像
  • 将图像大小调整为屏幕分辨率。如果你的屏幕很小他们的 没有理由你加载更大的图像。
  • 按照Android设计指南提供各种分辨率的图像。
  • 保持大部分图像修复并仅加载/更改动画部分

避免崩溃

  • 在将图像加载到内存link
  • 之前检查总堆内存大小
  • 确保垃圾回收工作正常。位图垃圾收集与常规垃圾收集略有不同,并且依赖于Android版本。
  • 尝试Java参考。

答案 1 :(得分:0)

您可以使用DiskLruCache缓存位图。它可以帮助您解决内存问题,并以相同的质量显示图像。请参阅https://github.com/JakeWharton/DiskLruCache

你只需要缓存一次。之后它从缓存文件夹加载图像。

     int count = 0;
         Runnable runnable = new Runnable() {

            @Override
            public void run() {
                count++;
                if (count < TOTAL_IMAGES) {
                   loadBitmap(count);
                   handler.postDelayed(runnable, 0);
            }
        }
    };
    handler.postDelayed(runnable, 0);


  // method for loading bitmap from cache folder
  private void loadBitmap(int id) {
            String filePath = Environment.getExternalStorageDirectory()+ "Folder Name/ Image Name " + id ;
            BitmapFactory.Options options = new BitmapFactory.Options();

            Bitmap b = BitmapFactory.decodeFile(filePath, options);
            if (b != null) {
                img.setImageBitmap(b);
                }
        }