gpt4 book ai didi

android - java.lang.OutOfMemoryError 发生在动画加载?

转载 作者:行者123 更新时间:2023-11-30 03:15:09 24 4
gpt4 key购买 nike

我从开发者网站得到的是“如果在加载时动画的总大小超过虚拟堆内存的值,就​​会发生这个错误”,解决方案使用BitmapFactory。我尝试了以下代码:

现在的问题是,“造成此错误的原因是什么?”:

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

    喜欢:如果我有 10 个图像尺寸(1100 * 1100)并为图像使用 ARGB_8888 模式。

  2. 图像的大小(500KB、1MB 等)对于此错误也很重要。

  3. 或者双方都对这个错误负责。

  4. 如果我在一个 Activity 上使用多个动画而不是将此 Activity 更改为另一个 Activity,如何释放我在之前使用的所有内存AnimationDrawable 的 Activity ?

欢迎所有建议。谢谢

代码

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 中获取动画的简单方法,但在这种情况下,应用程序启动时使用的总大小约为 44MB。 “完美运行”

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

我尝试没有错误,应用程序运行时大小约为 11Mb,但动画未显示在 ImageView 中。

请告诉我我做错了什么?

最佳答案

您可以通过 1) 在 list 文件中通过 android:largeheap="true"增加您的 dalvik 堆大小来解决您的错误

2) 如果你重复使用解码后的图像,那么你需要实现 Lrucache

3) 每当你使用 decodeSampleBitmapFromResource() 解码任何图像时,它的引用存储在 native 堆中。它可以被 System.gc() 清除以回收内存,但我们不能依赖它,因为它由操作系统决定什么时候发布。

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

关于android - java.lang.OutOfMemoryError 发生在动画加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20264420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com