相关疑难解决方法(0)

什么是android UI线程堆栈大小限制以及如何克服它?

我正在绘制视图层次结构时收到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.显然,这就是我的等级制度有点疯狂的原因.

我的问题:

  1. 什么是真正的堆栈大小限制?我发现无法测量UI线程的堆栈大小.网上有传闻说8KB,但有没有办法在一些样本设备上准确测量?

  2. 堆栈大小限制是否随OS ver而变化?同一层级并没有崩溃的4.0.3设备上但并崩溃上的2.3.3设备(相同的硬件).这是为什么?

  3. 除了手动优化层次结构外,还有其他方案吗?我发现无法增加UI线程的可笑小堆栈.对不起,但60-100堆栈帧限制是一个笑话.

  4. 假设#3上没有奇迹解决方案,那么应该针对核心层次结构优化的哪些建议进行推荐?

  5. 疯狂的想法 - 我注意到每个视图层添加了大约3个函数调用(View.draw,ViewGroup.dispatchDraw,ViewGroup.drawChild).也许我可以创建自己的ViewGroup实现(自定义布局),在draw()期间在堆栈上浪费更少?

android

26
推荐指数
1
解决办法
1万
查看次数

标签 统计

android ×1