Android开发中StackOverflowError错误实例分析
生活随笔
收集整理的這篇文章主要介紹了
Android开发中StackOverflowError错误实例分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/mozhizun/article/details/7051300
http://blog.csdn.net/gaomatrix/article/details/6604579
Android開發中StackOverflowError錯誤實例分析
一、概述 ?我在一個復雜的layout嵌套較多的android界面,碰到了java.lang.StackOverflowError這個Fatal Exception,app程序crash退出。這個錯誤出現的比較奇怪,在我做技術調研的時候,這個界面是放在單獨的一個程序中展示的,工作很正常,沒有出現這個嚴重錯誤,當將其嵌入到一個ActivityGroup后才報錯。
?????? android SDK中對該錯誤的出現的場景描述為:由于棧調用的層次太多,超過了虛擬器dalvik的最大限制(作為一個虛擬器參數,可定制)導致的。當程序編寫錯誤導致無限遞歸調用時會觸發,此外程序正確但是遞歸調用的層次過深也會觸發。
?????? 結合我的界面的情況,在單獨程序中運行時沒有問題,則說明不存在死循環的無限遞歸錯誤。觀察該界面的集成情況,發現為了Tab頁實現,該界面在顯示時,被兩個ActivityGroup嵌套,增加了6層顯式父layout。而因為該界面復雜,設計時,list_header view的layout深度為5層,而list_item的深度則為6層。原因定位為界面嵌套層次過深。
? 二、解決方法 ?解決嵌套過深的基本思路是在實現同樣的效果的前提下減少界面的layout深度。在我將list_header view layout深度由5層精簡為3層,list_item 深度由6層減少為4層后,該錯誤被解決。具體的方法有: 1)???????多用RelativeLayout的各種布局屬性來完成布局,而避免過多使用嵌套layout來實現。 2)???????占位或填充剩余空間的元素多用View,避免使用layout等viewGroup。
總結下,從實際的數據來看,設計中layout嵌套深度超過10層,就應該考慮下優化了,否則就會出現java.lang.StackOverflowError的crash了。
三、錯誤詳細日志 E/AndroidRuntime( 5196): FATAL EXCEPTION: main E/AndroidRuntime( 5196): java.lang.StackOverflowError E/AndroidRuntime( 5196): ?? at android.graphics.Paint.measureText(Paint.java:1057) E/AndroidRuntime( 5196): ?? at android.text.Styled.drawDirectionalRun(Styled.java:267) E/AndroidRuntime( 5196): ?? at android.text.Styled.measureText(Styled.java:430) E/AndroidRuntime( 5196): ?? at android.text.Layout.measureText(Layout.java:1655) E/AndroidRuntime( 5196): ?? at android.text.Layout.getLineMax(Layout.java:689) E/AndroidRuntime( 5196): ?? at android.text.Layout.draw(Layout.java:340) E/AndroidRuntime( 5196): ?? at android.widget.TextView.onDraw(TextView.java:4050) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6740) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.View.buildDrawingCache(View.java:6502) E/AndroidRuntime( 5196): ?? at android.view.View.getDrawingCache(View.java:6288) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1565) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.widget.AbsListView.dispatchDraw(AbsListView.java:1365) E/AndroidRuntime( 5196): ?? at android.widget.ListView.dispatchDraw(ListView.java:3046) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6846) E/AndroidRuntime( 5196): ?? at android.widget.AbsListView.draw(AbsListView.java:2257) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) E/AndroidRuntime( 5196): ?? at android.view.ViewRoot.draw(ViewRoot.java:1407) E/AndroidRuntime( 5196): ?? at W/ActivityManager(?? 71):?? Force finishing activity com.baidu.test/.CloudDemActivity W/WindowManager(?? 71): No window to dispatch pointer action 1
一、概述 ?我在一個復雜的layout嵌套較多的android界面,碰到了java.lang.StackOverflowError這個Fatal Exception,app程序crash退出。這個錯誤出現的比較奇怪,在我做技術調研的時候,這個界面是放在單獨的一個程序中展示的,工作很正常,沒有出現這個嚴重錯誤,當將其嵌入到一個ActivityGroup后才報錯。
?????? android SDK中對該錯誤的出現的場景描述為:由于棧調用的層次太多,超過了虛擬器dalvik的最大限制(作為一個虛擬器參數,可定制)導致的。當程序編寫錯誤導致無限遞歸調用時會觸發,此外程序正確但是遞歸調用的層次過深也會觸發。
?????? 結合我的界面的情況,在單獨程序中運行時沒有問題,則說明不存在死循環的無限遞歸錯誤。觀察該界面的集成情況,發現為了Tab頁實現,該界面在顯示時,被兩個ActivityGroup嵌套,增加了6層顯式父layout。而因為該界面復雜,設計時,list_header view的layout深度為5層,而list_item的深度則為6層。原因定位為界面嵌套層次過深。
? 二、解決方法 ?解決嵌套過深的基本思路是在實現同樣的效果的前提下減少界面的layout深度。在我將list_header view layout深度由5層精簡為3層,list_item 深度由6層減少為4層后,該錯誤被解決。具體的方法有: 1)???????多用RelativeLayout的各種布局屬性來完成布局,而避免過多使用嵌套layout來實現。 2)???????占位或填充剩余空間的元素多用View,避免使用layout等viewGroup。
總結下,從實際的數據來看,設計中layout嵌套深度超過10層,就應該考慮下優化了,否則就會出現java.lang.StackOverflowError的crash了。
三、錯誤詳細日志 E/AndroidRuntime( 5196): FATAL EXCEPTION: main E/AndroidRuntime( 5196): java.lang.StackOverflowError E/AndroidRuntime( 5196): ?? at android.graphics.Paint.measureText(Paint.java:1057) E/AndroidRuntime( 5196): ?? at android.text.Styled.drawDirectionalRun(Styled.java:267) E/AndroidRuntime( 5196): ?? at android.text.Styled.measureText(Styled.java:430) E/AndroidRuntime( 5196): ?? at android.text.Layout.measureText(Layout.java:1655) E/AndroidRuntime( 5196): ?? at android.text.Layout.getLineMax(Layout.java:689) E/AndroidRuntime( 5196): ?? at android.text.Layout.draw(Layout.java:340) E/AndroidRuntime( 5196): ?? at android.widget.TextView.onDraw(TextView.java:4050) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6740) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.View.buildDrawingCache(View.java:6502) E/AndroidRuntime( 5196): ?? at android.view.View.getDrawingCache(View.java:6288) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1565) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.widget.AbsListView.dispatchDraw(AbsListView.java:1365) E/AndroidRuntime( 5196): ?? at android.widget.ListView.dispatchDraw(ListView.java:3046) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6846) E/AndroidRuntime( 5196): ?? at android.widget.AbsListView.draw(AbsListView.java:2257) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1638) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.drawChild(ViewGroup.java:1640) E/AndroidRuntime( 5196): ?? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) E/AndroidRuntime( 5196): ?? at android.view.View.draw(View.java:6743) E/AndroidRuntime( 5196): ?? at android.widget.FrameLayout.draw(FrameLayout.java:352) E/AndroidRuntime( 5196): ?? at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) E/AndroidRuntime( 5196): ?? at android.view.ViewRoot.draw(ViewRoot.java:1407) E/AndroidRuntime( 5196): ?? at W/ActivityManager(?? 71):?? Force finishing activity com.baidu.test/.CloudDemActivity W/WindowManager(?? 71): No window to dispatch pointer action 1
總結
以上是生活随笔為你收集整理的Android开发中StackOverflowError错误实例分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 融劵是什么
- 下一篇: 银行卡多少岁可以办卡