我从开发者网站获得的是“如果在加载时动画的总大小超过虚拟堆内存的值,则会发生此错误”,对于解决方案,请使用BitmapFactory
。我试过以下代码:
现在问题是,“这个错误的原因是什么?”:
当图像加载动画时,是否计算图像的尺寸。
赞:如果我有10个图像尺寸(1100 * 1100)并使用ARGB_8888图案作为图像。
图像尺寸(500KB,1MB等)对此错误也很重要。
或者两者都对此错误负责。
如果我在单个活动上使用多个动画而不是change this Activity to another Activity
,如何通过AnimationDrawable
释放我在上一个活动中使用的所有内存?
欢迎所有建议。谢谢
代码
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)中提到注释时,这是在ImageView中获取动画的简单方法,但在这种情况下,启动应用程序时使用的toatal大小约为44MB。 '运行完美'
我在试用中提到(2),这是由Android开发者网站here提供的解决方案。
我没有尝试过错误,当App运行但是动画没有在ImageView中显示时,尺寸是apporox 11Mb。
请告诉我我做错了什么?
答案 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。这个动画由多帧组成。