【发布时间】:2013-05-26 10:52:09
【问题描述】:
在绘制视图层次结构时,我得到 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)
...
Research 指向我的视图层次结构太深,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() 期间减少堆栈浪费?
【问题讨论】:
-
一个类似于我疯狂想法#5的想法:stackoverflow.com/questions/6705425/…
-
澄清一下,寻找筹码量背后的原因是估计有问题的市场规模。由于较新版本的操作系统似乎有更大的堆栈,我想找出我容易崩溃的地方,看看我是否可以忍受它
-
您应该真正解决 19 级嵌套视图层次结构(这并不能真正证明自己的合理性)。 看看我能不能忍受它然后如何忍受它?您只是让设备崩溃(连同您的应用评分)? Gingerbread 占据了大约 40% 的市场份额,再加上糟糕的硬件将导致很大一部分市场无法满足您的需求(更糟糕的是,您可能正在处理随机设备崩溃)。
-
好吧,将 19 优化到更少当然是有代价的。我应该走多低?我试图进行某种测量,这样我就可以准确计算出我想要玩的安全程度。随便说最多 15 个关卡对我来说有点过分了..
标签: android