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

本文记录了一种经典的Android异常——android.view.InflateException,该异常通常是由于内存不足(out of memory)导致的。问题在于,尽管Activity被finish(),但其资源未被正确释放,特别是ImageView中的大型图片。解决方案是在onStop()方法中手动释放资源,回收Bitmap,避免内存泄漏。此外,还提供了防止内存泄漏的几点建议,包括避免Activity上下文泄露、管理内存缓存、使用Fragments等。
摘要由CSDN通过智能技术生成

今天的异常很有意思,叫做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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值