也談DataBinding遇到的惡心的Bug,踩坑踐行者。
項目中遇到的一個問題,分享出來,希望大家可以不踩這個坑
前話,公司是用Mac開發,在家里有時候會用Win加加班,公司的項目有幾個使用了Databinding,在Mac上運行都是沒有問題的,我推到Git上,回家拉下來,其中的一個報錯了,另外的都沒有問題!
用過Databinding的同學都是知道,Databinding本身報錯就是全部報錯,并且不會有具體的錯誤,而且項目中還有Dagger2,Dagger2報錯跟Databinding一個尿性報錯那么多,都不是解決的依據。這一次報錯,那錯誤直接需要拖好幾頁,連個重點都找不到!醉了
分析問題
- 公司項目本身沒有錯,在家里報錯,問題應該不在代碼層面上
- 之前處理過一次utf8的問題,win下gradle 添加這么一行東西
tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
android.databinding.annotationprocessor.ProcessExpressions@65ff4c24 javax.xml.bind.UnmarshalException with linked exception:
Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence.
我們遇到的坑大概率是別人踩過的坑,Google或者其他的搜索引擎,據說是IDE的一部分,于是找到了這個博客,確定了自己的猜測。
題外話&問題原因&個人習慣
Databinding最好的使用,通常是后臺返回直接展示的數據,而實際上后臺返回的數據有時候需要我們在處理一下,我的同事的方法是跟鏈接博客中一樣,喜歡在xml里面做操作,(比如android:text='@{monthBean.onlineCount+"單"}')我自己則是喜歡在bean對象里面做處理,通過前綴為getStringXXX的方式來獲取,而導致這個問題原因正是因為在xml里面做拼接的字符不能被正確的解析, 那么問題來了,另外其他的項目,同事也有在外面做處理,為什么沒有報錯,猜測是特定的字符不能被解析造成的。
剩下的就是力氣活,由于有段時間沒有拉這個代碼,積累的較多,我不能確定是什么時候造成的,只能猜測著用Git不斷的切換,定位到產生的原因.
不管怎樣終于找到了,奇怪的是有的拼接沒有問題有的拼接有問題,這其實是另外兩個同事寫的,看來同樣是mac還是有些差別,anyway總算解決了可以繼續寫應該寫的了.
android:text='@{monthBean.onlineCount+"單"}' 報錯
android:text='@{billCheckoutInfo.runKm+ "公里"}' 不報錯
解決和建議
android:text='@{monthlyBeanBinding.onlineCount + @string/dan}'
我會在跟同事核實為什么一個人的拼接沒問題另一個人報錯,建議是用getStringXXX的方式來拼接,那樣可以避免這些問題,如果非要拼接就要用@String/XXX的方式.
希望以后不要再遇到這樣的問題,耽擱了一段時間,但是我還是喜歡win系統,總感覺文件系統就應該是win這樣而不是mac那樣,很不習慣.
最后放上CC
圖片.png
來自:http://www.jianshu.com/p/b969992cd833