异常记录:
异常出现情景(三星手机出现几率特别大):打开一个activity,这个activity只用来播放一个ViewPager的轮播动画(一般会在app首次启动时)。轮播到最后一张时,关掉activity(finish)。开第二的activity,在加载LayoutInflate.from(context).inflate()时会出现android.view.InflateException: Binary XML file line #69: Error inflating class.caused by out of memory.异常
一开始我怎么也没有想明白,activity已经都finish了,怎么可能会内存不足。其实是因为我们并没有手工回收资源,换句话说,java的垃圾回收机制并没有那么的聪明,我们finish掉了,但里面相关的资源他未必回收。有可能他自以为很聪明的留下来等着我们下次使用。所以我们需要在onStop的方法中手动释放imageView这样的大型资源。
解决办法:
1.定义一个方法releaseImageViews(),用来释放imageView资源
//释放所有的图片
private void releaseImageViews() {
releaseImageView(iv1);
releaseImageView(iv2);
releaseImageView(iv3);
releaseImageView(iv4);
releaseImageView(iv5);
}
/*手工回收资源*/
private void releaseImageView(ImageView imageView) {
Drawable d = imageView.getDrawable();
if (d != null)
d.setCallback(null);
imageView.setImageDrawable(null);
imageView.setBackgroundDrawable(null);
}
2.重写onDestroy方法:
@Override
protected void onDestroy() {
releaseImageViews();
super.onDestroy();
}