Android慎用layout嵌套, 盡量控制在5層下面java.lang.StackOverflowError

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.