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

這個錯誤是在我們項目裏面的大圖預覽界面出的,並且不是必現的是偶發的,直接到佈局文件裏面找也沒找到啥問題,然後到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。

 

在網上找原因的時候也發現了一些靠譜的自己沒有重視過的可能引起該問題的原因,比如:將資源圖片放錯了資源文件夾,造成系統加載的時候內存爆了等

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章