Android开发中StackOverflowError错误实例分析
生活随笔
收集整理的這篇文章主要介紹了
Android开发中StackOverflowError错误实例分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://blog.csdn.net/mozhizun/article/details/7051300
http://blog.csdn.net/gaomatrix/article/details/6604579
Android開發(fā)中StackOverflowError錯(cuò)誤實(shí)例分析
一、概述 ?我在一個(gè)復(fù)雜的layout嵌套較多的android界面,碰到了java.lang.StackOverflowError這個(gè)Fatal Exception,app程序crash退出。這個(gè)錯(cuò)誤出現(xiàn)的比較奇怪,在我做技術(shù)調(diào)研的時(shí)候,這個(gè)界面是放在單獨(dú)的一個(gè)程序中展示的,工作很正常,沒有出現(xiàn)這個(gè)嚴(yán)重錯(cuò)誤,當(dāng)將其嵌入到一個(gè)ActivityGroup后才報(bào)錯(cuò)。
?????? android SDK中對(duì)該錯(cuò)誤的出現(xiàn)的場(chǎng)景描述為:由于棧調(diào)用的層次太多,超過了虛擬器dalvik的最大限制(作為一個(gè)虛擬器參數(shù),可定制)導(dǎo)致的。當(dāng)程序編寫錯(cuò)誤導(dǎo)致無限遞歸調(diào)用時(shí)會(huì)觸發(fā),此外程序正確但是遞歸調(diào)用的層次過深也會(huì)觸發(fā)。
?????? 結(jié)合我的界面的情況,在單獨(dú)程序中運(yùn)行時(shí)沒有問題,則說明不存在死循環(huán)的無限遞歸錯(cuò)誤。觀察該界面的集成情況,發(fā)現(xiàn)為了Tab頁實(shí)現(xiàn),該界面在顯示時(shí),被兩個(gè)ActivityGroup嵌套,增加了6層顯式父layout。而因?yàn)樵摻缑鎻?fù)雜,設(shè)計(jì)時(shí),list_header view的layout深度為5層,而list_item的深度則為6層。原因定位為界面嵌套層次過深。
? 二、解決方法 ?解決嵌套過深的基本思路是在實(shí)現(xiàn)同樣的效果的前提下減少界面的layout深度。在我將list_header view layout深度由5層精簡(jiǎn)為3層,list_item 深度由6層減少為4層后,該錯(cuò)誤被解決。具體的方法有: 1)???????多用RelativeLayout的各種布局屬性來完成布局,而避免過多使用嵌套layout來實(shí)現(xiàn)。 2)???????占位或填充剩余空間的元素多用View,避免使用layout等viewGroup。
總結(jié)下,從實(shí)際的數(shù)據(jù)來看,設(shè)計(jì)中l(wèi)ayout嵌套深度超過10層,就應(yīng)該考慮下優(yōu)化了,否則就會(huì)出現(xiàn)java.lang.StackOverflowError的crash了。
三、錯(cuò)誤詳細(xì)日志 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
一、概述 ?我在一個(gè)復(fù)雜的layout嵌套較多的android界面,碰到了java.lang.StackOverflowError這個(gè)Fatal Exception,app程序crash退出。這個(gè)錯(cuò)誤出現(xiàn)的比較奇怪,在我做技術(shù)調(diào)研的時(shí)候,這個(gè)界面是放在單獨(dú)的一個(gè)程序中展示的,工作很正常,沒有出現(xiàn)這個(gè)嚴(yán)重錯(cuò)誤,當(dāng)將其嵌入到一個(gè)ActivityGroup后才報(bào)錯(cuò)。
?????? android SDK中對(duì)該錯(cuò)誤的出現(xiàn)的場(chǎng)景描述為:由于棧調(diào)用的層次太多,超過了虛擬器dalvik的最大限制(作為一個(gè)虛擬器參數(shù),可定制)導(dǎo)致的。當(dāng)程序編寫錯(cuò)誤導(dǎo)致無限遞歸調(diào)用時(shí)會(huì)觸發(fā),此外程序正確但是遞歸調(diào)用的層次過深也會(huì)觸發(fā)。
?????? 結(jié)合我的界面的情況,在單獨(dú)程序中運(yùn)行時(shí)沒有問題,則說明不存在死循環(huán)的無限遞歸錯(cuò)誤。觀察該界面的集成情況,發(fā)現(xiàn)為了Tab頁實(shí)現(xiàn),該界面在顯示時(shí),被兩個(gè)ActivityGroup嵌套,增加了6層顯式父layout。而因?yàn)樵摻缑鎻?fù)雜,設(shè)計(jì)時(shí),list_header view的layout深度為5層,而list_item的深度則為6層。原因定位為界面嵌套層次過深。
? 二、解決方法 ?解決嵌套過深的基本思路是在實(shí)現(xiàn)同樣的效果的前提下減少界面的layout深度。在我將list_header view layout深度由5層精簡(jiǎn)為3層,list_item 深度由6層減少為4層后,該錯(cuò)誤被解決。具體的方法有: 1)???????多用RelativeLayout的各種布局屬性來完成布局,而避免過多使用嵌套layout來實(shí)現(xiàn)。 2)???????占位或填充剩余空間的元素多用View,避免使用layout等viewGroup。
總結(jié)下,從實(shí)際的數(shù)據(jù)來看,設(shè)計(jì)中l(wèi)ayout嵌套深度超過10層,就應(yīng)該考慮下優(yōu)化了,否則就會(huì)出現(xiàn)java.lang.StackOverflowError的crash了。
三、錯(cuò)誤詳細(xì)日志 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
總結(jié)
以上是生活随笔為你收集整理的Android开发中StackOverflowError错误实例分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 融劵是什么
- 下一篇: Android 6.0动态权限