绘制视图层次结构时出现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,但有没有办法在某些样机上准确测量?
堆栈大小限制是否随操作系统版本而变化?相同的层次结构不会在4.0.3 设备上崩溃,但会在 2.3.3 设备(相同硬件)上崩溃。这是为什么?
除了手动优化层次结构外,还有其他解决方案吗?我发现没有办法增加 UI 线程的小得可笑的堆栈。抱歉,60-100 堆栈帧限制是个笑话。
假设在#3 上没有奇迹解决方案,对于应该在哪里进行核心层次优化的任何建议?
疯狂的想法 - 我注意到每个视图层都添加了大约 3 个函数调用(View.draw、ViewGroup.dispatchDraw、ViewGroup.drawChild)。也许我可以制作自己的 ViewGroup 实现(自定义布局),在 draw() 期间减少堆栈上的浪费?