昨天用ListView寫的一個相似微博動態頁面,在Android4.4上運行良好,在一款2.3系統的手機上運行崩潰,看log是java.lang.StackOverflowError(堆棧溢出)。java
Android SDK 場景描述爲:因爲棧調用的層次太多,超過了虛擬器dalvik的最大限制(做爲一個虛擬器參數,可定製)致使的。當程序編寫錯誤致使無限遞歸調用時會觸發,此外程序正確可是遞歸調用的層次過深也會觸發。佈局
Google後發如今ListView中形成這種狀況的緣由是佈局嵌套太多形成的,因此我就看個人ListView Item 佈局,去掉1、兩層後發現仍是崩潰,最後就寫一個控件,仍是崩潰,這樣以後我就以爲應該不是ListView中Item的問題,而後我就看ListView所在頁面的佈局,其父佈局爲LinearLayout線性佈局嵌套,而後果斷去掉一層父佈局,結果ok。優化
最後提醒下開發人員,解決嵌套過深的基本思路是在實現一樣的效果的前提下減小界面的layout深度。具體的方法有:spa
1) 多用RelativeLayout的各類佈局屬性來完成佈局,而避免過多使用嵌套layout來實現。設計
2) 佔位或填充剩餘空間的元素多用View,避免使用layout等viewGroup。code
總結下,從實際的數據來看,設計中layout嵌套深度超過10層,就應該考慮下優化了,不然就會出現java.lang.StackOverflowError的crash了。orm