我正在绘制视图层次结构时收到java.lang.StackOverflowErrors:
at android.view.View.draw(View.java:6880)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
...
Run Code Online (Sandbox Code Playgroud)
研究指出我的视图层次结构太深,Android无法处理.实际上,使用Hierarchy Viewer,我可以看到我最长的嵌套是19个视图(!)
我的应用看起来有点像Google Play商店应用(带滑动标签).每个选项卡都是片段视图寻呼机内的嵌套片段 - 使用v4支持和HoloEverywhere.显然,这就是我的等级制度有点疯狂的原因.
我的问题:
什么是真正的堆栈大小限制?我发现无法测量UI线程的堆栈大小.网上有传闻说8KB,但有没有办法在一些样本设备上准确测量?
堆栈大小限制是否随OS ver而变化?同一层级并没有崩溃的4.0.3设备上但并崩溃上的2.3.3设备(相同的硬件).这是为什么?
除了手动优化层次结构外,还有其他方案吗?我发现无法增加UI线程的可笑小堆栈.对不起,但60-100堆栈帧限制是一个笑话.
假设#3上没有奇迹解决方案,那么应该针对核心层次结构优化的哪些建议进行推荐?
疯狂的想法 - 我注意到每个视图层添加了大约3个函数调用(View.draw,ViewGroup.dispatchDraw,ViewGroup.drawChild).也许我可以创建自己的ViewGroup实现(自定义布局),在draw()期间在堆栈上浪费更少?
我在刷新SlidingTray中的视图时遇到了崩溃(自定义的SlidingDrawer来自顶部).
我不确定是什么导致它..但我的第一个猜测是,这是由于嵌套布局的数量......
嵌套布局的最大数量是多少?
它是特定于设备的,我怎么能确定这是否是原因?
如果不是,那么这些东西都会导致它......是什么?
堆栈跟踪:
E/AndroidRuntime( 2199): FATAL EXCEPTION: main
E/AndroidRuntime( 2199): java.lang.StackOverflowError
E/AndroidRuntime( 2199): at android.graphics.Paint.measureText(Paint.java:1057)
E/AndroidRuntime( 2199): at android.text.Styled.drawDirectionalRun(Styled.java:267)
E/AndroidRuntime( 2199): at android.text.Styled.measureText(Styled.java:430)
E/AndroidRuntime( 2199): at android.text.Layout.measureText(Layout.java:1655)
E/AndroidRuntime( 2199): at android.text.Layout.getLineMax(Layout.java:689)
E/AndroidRuntime( 2199): at android.text.Layout.draw(Layout.java:340)
E/AndroidRuntime( 2199): at android.text.BoringLayout.draw(BoringLayout.java:365)
E/AndroidRuntime( 2199): at android.widget.TextView.onDraw(TextView.java:4168)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6880)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): …Run Code Online (Sandbox Code Playgroud) 以下是我的堆栈跟踪.我仔细查看了它,但它只显示了一堆视图,坦率地说,我不太确定stackoverflow错误是什么.我读了一些其他问题,有些人通过迭代解决了他们的问题(再次,不知道那些是什么).对于应用程序的基本布局,这是在崩溃时发生的:
TabView(5个选项卡)>第5个选项卡>按钮按下该选项卡中的webview.现在它确实崩溃,直到我点击后退按钮返回到第5个选项卡,并且它不会每次都这样做.
谢谢您的帮助!
编辑:我在模拟器上停止测试,我还没有看到它在我的手机上崩溃.我将欣赏并研究任何进一步的帮助,但我认为这只是一个模拟器问题.
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): FATAL EXCEPTION: main
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): java.lang.StackOverflowError
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewRoot.checkThread(ViewRoot.java:2801)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewRoot.requestChildFocus(ViewRoot.java:1567)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:431)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:431)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:431)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:431)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:431)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:431)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.View.handleFocusGainInternal(View.java:2486)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.View.requestFocus(View.java:3605)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.View.requestFocus(View.java:3556)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.view.View.requestFocus(View.java:3534)
04-20 01:52:26.510: ERROR/AndroidRuntime(23240): at android.widget.TabWidget.onFocusChange(TabWidget.java:425)
04-20 …Run Code Online (Sandbox Code Playgroud)