我现在正在编写一个应用程序,它使用占据大部分屏幕的四个主要按钮。每个都有三个动画:一个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是一样的)
答案 0 :(得分:1)
您可以做几件事来减少内存消耗。
避免崩溃
答案 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);
}
}