Android:增加调用堆栈大小

PVo*_*Lan 12 stack-overflow android

我有一个非常复杂的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:", " = " + i);
        overflow(i+1);
    }
}
Run Code Online (Sandbox Code Playgroud)

导致StackOverflowError深度约260-270个电话.

每次调用第二个测试用例的堆栈元素需要4个字节+ 4 bytes作为参数的返回地址= 8 bytes.Dalvik'sVM 可能会在每个元素中保留更多信息,但即使16 bytes per element * 260 calls = about 4Kbytes是最大的整体堆栈大小也是如此.这似乎不够.

有没有办法增加最大堆栈大小?

Mar*_*res 26

您可能无法在主UI线程中增加调用堆栈大小(这是可以理解的,因为您应该尽可能少地执行此操作),但您可以通过使用Thread对象在单独的线程中执行此操作.构造函数参数:

ThreadGroup group = new ThreadGroup("threadGroup");
new Thread(group, runnableObject, "YourThreadName", 2000000).start();
Run Code Online (Sandbox Code Playgroud)

通过这个例子,我将堆栈大小从8k(大约260个调用)增加到2M(足以不得到StackOverFlowException,当然你可以根据需要添加尽可能多的内存),所以最后,对于进一步的读者,这是你可以增加堆栈大小的方法,虽然不推荐,在某些情况下,它实际上是必要的,例如一个具有广泛递归调用的算法,当然还有通过在工作线程中完成所有艰苦工作(如您应该)使用您指定的堆栈大小,并使用主要UI线程与处理程序或您想用来与之交互的任何机制在UI中"发布"更改...

希望这可以帮助...

问候!