这个错误是在我们项目里面的大图预览界面出的,并且不是必现的是偶发的,直接到布局文件里面找也没找到啥问题,然后到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。
在网上找原因的时候也发现了一些靠谱的自己没有重视过的可能引起该问题的原因,比如:将资源图片放错了资源文件夹,造成系统加载的时候内存爆了等