当我的视图层次结构被绘制时,我遇到了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)
...
研究指出,我的视图层次结构对Android来说太深了。使用Hierarchy Viewer,我可以看到我的最长嵌套是19个视图!
我的应用程序有点像Google Play商店应用程序(带有刷卡选项卡)。每个选项卡都是一个嵌套的片段,在片段视图页中 - 使用v4支持和HoloEverywhere。显然,这就是为什么我的层次结构变得有点疯狂。
我的问题:
真正的堆栈大小限制是多少?我找不到测量UI线程堆栈大小的方法。互联网上有些传言说是8KB,但是否有一种方法可以在某些样本设备上准确地测量?
堆栈大小限制是否随着OS版本而改变?相同的层次结构在4.0.3设备上不会崩溃,但在2.3.3设备上会崩溃(硬件相同)。为什么会这样?
除了手动优化层次结构之外,还有其他解决方案吗?我找不到增加UI线程的非常小堆栈的方法。抱歉,但60-100个堆栈帧限制就是一个笑话。
假设在#3上没有神奇的解决方案,是否有任何建议应该在哪里进行核心层次结构优化?
疯狂的想法 - 我注意到每个视图层都会添加大约3个函数调用(View.draw,ViewGroup.dispatchDraw,ViewGroup.drawChild)。也许我可以创建自己的ViewGroup实现(自定义布局),在draw()期间浪费更少的堆栈?