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