我正在绘制视图层次结构时收到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()期间在堆栈上浪费更少?
我有一个非常复杂的UI应用程序,包含许多layouts嵌套的应用程序.在创建另一个布局时,我抓住了一个StackOverflowError
想知道,我创建了两个测试示例:
1)以下xml主要活动的Hello world应用程序
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<!-- ...So on 30 times... -->
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
<!-- ...So on 30 times... -->
</FrameLayout>
</FrameLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
在绘制布局时导致StackOverflowError(导致每个布局递归地绘制它的子节点)
2)以下测试用例
public class TestOverflowActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overflow(0);
}
private void overflow(int i){
android.util.Log.i("Stack depth:", " = " …Run Code Online (Sandbox Code Playgroud)