我的应用程序具有非常复杂的用户界面,其中包含许多嵌套在另一个中的布局
。在创建另一个布局时,我遇到了一个StackOverflowError
我想知道原因,于是创建了两个测试示例:
1)Hello world应用程序,主Activity的xml
如下:
<?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>
当绘制布局时,会引发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:", " = " + i);
overflow(i+1);
}
}
在深度约为260-270次调用时会导致 StackOverflowError
错误。
对于第二个测试案例中的每个函数调用,栈元素会消耗4字节用于返回地址,+4字节
用于参数,总共是8字节
。虚拟机Dalvik
可能会在每个元素中保存更多的信息,但即使每个元素占用 16字节* 260次调用=最大堆栈大小约为4K字节
,这似乎还不够。
有没有办法增加最大堆栈大小?