標籤:data 元素 crash 遞迴 不能 情況 soft 精簡 relative
一、探尋原因在一個複雜的layout嵌套較多layout的android介面。在Android 2.3、記憶體較低 的機型上,出現 java.lang.StackOverflowError 這個Exception,appcrash退出。
這個錯誤出現的比較奇怪,在我做技術調研的時候,這個介面是放在4.0的系統中測試,工作非常正常,沒有出現這個嚴重錯誤。
android SDK中對該錯誤的出現的情境描寫敘述為:因為棧調用的層次太多。超過了虛擬器dalvik的最大限制(作為一個虛擬器參數,可定製)導致的。當程式編寫錯誤導致無限遞迴調用時會觸發,此外程式正確可是遞迴調用的層次過深也會觸發。 在尋找問題的過程中,採取排除法。一點點凝視代碼。找到是由於語音控制項的問題。去掉語音控制項,不會出現Crash。觀察該介面的整合情況,發現當加入語音控制項後,又添加了一層layout, 此時已說明layout的嵌套已經達到最大值,不能容忍再加入1層。而由於該介面複雜,設計時, view的layout深度為6層。
原因定位為介面嵌套層次過深,初步認定解決方式為降低layout層次。 二、解決方案 解決嵌套過深的基本思路是在實現相同的效果的前提下降低介面的layout深度。
在我將layout深度由6層精簡為4層,該錯誤被解決。SDK提供的解決方案有:1) 多用RelativeLayout的各種布局屬性來完畢布局,而避免過多使用嵌套layout來實現。 2) 佔位或填充剩餘空間的元素多用View,避免使用layout等viewGroup。final 方法有:由於咱的View層次的確須要非常多,所以從改變View層次入手非常難,開始糾結了非常久,最終找到突破口。在Android官方SDK提供了一種XML標籤, 在官方文檔裡的標註就是通過merge標籤來降低視圖層級結構。
這個問題暫且如此解決吧,開發中注意不要在現有深度上添加深度。
同一時候繼續尋找進一步解決方式。
總結下,從實際的資料來看,設計中layout嵌套深度超過10層(假設要相容低端機型,最好不要超過5層)。就應該考慮下最佳化了,否則就會出現java.lang.StackOverflowError的crash了。
Android慎用layout嵌套, 盡量控制在5層下面java.lang.StackOverflowError