android 细节之android.view.InflateException: Binary XML file line #95: Error inflating class(out of m)

今天的异常很有意思,叫做android.view.InflateException: Binary XML file line #95: Error inflating class(out of memory) 。

其实是因为out of memory,导致 xml是不可能被充气成功,因此activity的onCreate方法中,

setContentView(R.layout.***)也就不可能成功调用.

他出现在我有多个教学动画,并且播放的动画,是基于imageView,imageView的背景是我们项目的大型图片。

出错情境为:打开一个activity,这个activity只用来播放一个动画。然后手动back,关掉activity(finish)。开第二的activity,第二个activity绑定的layout和第一个不一样,播放另一个动画。手动back,关掉activity。

以此类推,多次运行后会出现做android.view.InflateException: Binary XML file line #95: Error inflating class.

caused by out of memory.

一开始我怎么也没有想明白,每次我的activity都finish了,怎么可能会内存不足。

于是上网找答案,在亲爱的stackoverflow上发现了大神的评论,(大神请移步:http://stackoverflow.com/questions/7536988/android-app-out-of-memory-issues-tried-everything-and-still-at-a-loss/7576275),原来提出问题的哥也试了everything,哈哈。


其实是因为我们并没有手工回收资源,换句话说,java的垃圾回收机制并没有那么的聪明,我们finish掉了,但里面相关的资源他未必回收。有可能他自以为很聪明的留下来等着我们下次使用。所以我们需要在onStop的方法中手动释放imageView这样的大型资源。


大神的写法如下:

Drawable d = imageView.getDrawable();  
if (d != null) d.setCallback(null);  
imageView.setImageDrawable(null);  
imageView.setBackgroundDrawable(null);

我之后在我们项目中的五个播放动画的教学activity中同样配置了如下代码:

@Override
	protected void onStop() {
		releaseImageViews();
		super.onStop();
	}

	private void releaseImageViews() {
		releaseImageView(mTerminal);
		releaseImageView(mFingerPressInnerRing);
		releaseImageView(mFingerPressMiddleRing);
		releaseImageView(mFingerPressOuterRing);
		releaseImageView(mInnerRing);
		releaseImageView(mMiddleRing);
		releaseImageView(mOuterRing);
		releaseImageView(mPhone);
		releaseImageView(mScreen);
	}

	private void releaseImageView(ImageView imageView) {
		Drawable d = imageView.getDrawable();
		if (d != null)
			d.setCallback(null);
		imageView.setImageDrawable(null);
		imageView.setBackgroundDrawable(null);
	}

此问题便解决了。


异常很经典,特记录之。


大神的tips:

Some tips:

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值