android.view.InflateException: Binary XML file line : Error inflating class <unknown>

项目大图预览界面出现inflate错误,非必现。查看inflate源码,发现异常在catch时抛出,紧跟的是oom日志。根本原因是预览大图已用SubsamplingScaleImageView处理仍内存不足,加载自定义ProgressBar资源致内存爆了。解决可优化进度条,也需排查资源图片文件夹放置问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个错误是在我们项目里面的大图预览界面出的,并且不是必现的是偶发的,直接到布局文件里面找也没找到啥问题,然后到inflate 源码里面找了下,位置如下:

可以看到,是在catch Execption的时候报的,这个异常可能发生在这个过程中任何地方,所以当时感觉应该是在界面上别的异常引起的,然后 注意到紧跟着这个异常的是一个oom,是系统内存爆了日志如下:

"android.view.InflateException: Binary XML file line #48: Error inflating class <unknown>
	at android.view.LayoutInflater.createView(LayoutInflater.java:620)
	at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
	at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
	at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
	at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
	at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
	at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
	at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
	at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
	at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
	at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
	*****************************************.onCreateView(TbsSdkJava:212)
	at android.support.v4.app.Fragment.performCreateView(TbsSdkJava:2346)
	at android.support.v4.app.FragmentManagerImpl.moveToState(TbsSdkJava:1428)
	at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(TbsSdkJava:1759)
	at android.support.v4.app.FragmentManagerImpl.moveToState(TbsSdkJava:1827)
	at android.support.v4.app.BackStackRecord.executeOps(TbsSdkJava:797)
	at android.support.v4.app.FragmentManagerImpl.executeOps(TbsSdkJava:2596)
	at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(TbsSdkJava:2383)
	at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(TbsSdkJava:2338)
	at android.support.v4.app.FragmentManagerImpl.execSingleAction(TbsSdkJava:2215)
	at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(TbsSdkJava:649)
	at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(TbsSdkJava:167)
	at android.support.v4.view.ViewPager.populate(TbsSdkJava:1238)
	at android.support.v4.view.ViewPager.populate(TbsSdkJava:1086)
	at android.support.v4.view.ViewPager$3.run(TbsSdkJava:267)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:774)
	at android.view.Choreographer.doCallbacks(Choreographer.java:579)
	at android.view.Choreographer.doFrame(Choreographer.java:547)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:760)
	at android.os.Handler.handleCallback(Handler.java:730)
	at android.os.Handler.dispatchMessage(Handler.java:92)
	at android.os.Looper.loop(Looper.java:137)
	at android.app.ActivityThread.main(ActivityThread.java:5162)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:525)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
	... 1 more
Caused by: java.lang.reflect.InvocationTargetException
	at java.lang.reflect.Constructor.constructNative(Native Method)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
	at android.view.LayoutInflater.createView(LayoutInflater.java:594)
	... 39 more
Caused by: java.lang.OutOfMemoryError
	at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
	at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:503)
	at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:356)
	at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:800)
	at android.content.res.Resources.loadDrawable(Resources.java:2138)
	at android.content.res.Resources.getDrawable(Resources.java:701)
	at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:282)
	at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:901)
	at android.graphics.drawable.Drawable.createFromXml(Drawable.java:837)
	at android.content.res.Resources.loadDrawable(Resources.java:2120)
	at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
	at android.widget.ProgressBar.<init>(ProgressBar.java:306)
	at android.widget.ProgressBar.<init>(ProgressBar.java:247)
	at android.widget.ProgressBar.<init>(ProgressBar.java:243)

可以看到内存爆了是因为取加载ProgressBar里面的的资源,是一个自定义的ProgressBar,做的花里胡哨的。

所以:问题的根本原因是oom。因为在预览大图界面,显示高素质的图片,已经使用了SubsamplingScaleImageView 去处理,但是还是oom了,哎,没办法,只能拿这个进度条下手了(早就看他不顺眼了),优化ProgressBar,尽量减少内存的占用。

最后 出了这个问题,只要不是布局写错,那么就看看界面里面有啥异常的信息,优先oom。

 

在网上找原因的时候也发现了一些靠谱的自己没有重视过的可能引起该问题的原因,比如:将资源图片放错了资源文件夹,造成系统加载的时候内存爆了等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值