【Android】android.view.InflateException: Binary XML file line #1: Error inflating class

網路上這個錯誤的log稍微查一下可以看到蠻多的可能造成這個錯誤的點
(如下圖)


這兩天在開發時遇到了一個問題~
需求是廠商突然要求要換掉預設圖片,於是東切切西切切就是切不出個對的格式給設計師
所以廠商將切好的圖片mail給設計師,設計師再修改圖片的尺寸
拿到圖片檔後就很自然的將圖片直接覆蓋過原本的預設圖片~以為一切都如此容易的時候...
就發生了Crash(如上圖所示)

OK這時候我們只好一步步來
從發生的錯誤的Log中我們可以先看幾個可能的點在
先從上面兩個框框開始看找到對應的位置分別在....
<com.facebook.drawee.view.SimpleDraweeView

@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    viewRoot = inflater.inflate(R.layout.fragment_about_course_info, container, false);   //這行發生錯誤    DataChange.getInstance().addObserver(watcher);    findView();    init();    setListener();    return viewRoot;}


所以就連想到可能會是在onCreateView的時候就SimpleDraweeView可能為null進而造成Crash
在找解法的時候就有點被誤導(以為自己沒有做初始化的動作)
即在onCreateView中補上 Fresco.initialize(getContext());

結論:一樣Crash....
換設備再做測試時發現
硬體規格較新的設備上這個Crash是偶發性
硬體規格較差的設備上Crash是100%會發生

就重新釐清思緒(配合剩下的兩個紅框找問題點)
其實有開發過android的工程師應該對這個錯誤的訊息不會太陌生
Caused by: java.lang.OutOfMemoryError   (俗稱OOM內存溢出)
這點到是自己疏忽掉,一直再找code是不是哪裡沒寫好,卻忘了自己做了甚麼事.....

回顧自己做了甚麼....阿不就很自然地把圖給覆蓋過去而已....
覆蓋過去...
覆蓋過去...??
那圖的差異呢??!!!(突然想通了些甚麼!)

再問一下了我師父"谷哥"找到了下面一篇文章
android.view.InflateException: Binary XML file line #1: Error inflating class <unknown>

android再開發時如果有做個尺寸的切圖動作
應該對下面幾個資料夾不會太陌生







圖片會依照設備的螢幕尺寸度不同針對個別適合的尺寸取不同解析度的圖片

而再覆蓋圖片的時候我卻沒注意到新切好的圖片解析度太大....
所以把解析度過大的圖片塞到SimpleDraweeView中....
直接造成OOM內存溢出的狀況發生....

解決方式:
請設計師新切一份解析度正常的套圖,再重新覆蓋後即正常。

P.S.  
正常的圖片解析度為1032x582   
造成crash的圖片解析度為3840x2160




沒有留言:

張貼留言