Android:增加呼叫堆栈大小

前端之家收集整理的这篇文章主要介绍了Android:增加呼叫堆栈大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序与非常复杂的UI,包含许多布局嵌套在另一个.在创建另一个布局时,我遇到了一个StackOverflowError

想知道,我创造了两个测试例子:

1)Hello world应用程序与以下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);
    }
}

导致StackOverflowError深度约260-270个调用.

对于第二个测试用例,每个调用堆栈元素需要4个字节用于返回地址4个字节,用于参数= 8个字节. Dalvik的VM可能在每个元素中保持更多的信息,但是每个元素甚至16个字节* 260个调用=最大总体堆栈大小为4Kbytes.这似乎不够

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

解决方法

您可能无法在主UI线程中增加调用堆栈大小(这是可以理解的,因为您应该在这里尽可能少的事情),但是您可以通过使用Thread对象的构造函数参数:
ThreadGroup group = new ThreadGroup("threadGroup");
new Thread(group,runnableObject,"YourThreadName",2000000).start();

有了这个例子,我将堆栈大小从8k(大约260个调用)增加到2M(足够不能得到StackOverFlowException,当然你可以添加尽可能多的内存可以占用它),所以到最后对于更多的读者来说,这是您可以增加堆栈大小的方式,尽管不建议,但在某些情况下,实际上还需要一个具有广泛递归调用的算法,当然也可以通过在工作线程中进行所有的辛勤工作你应该)使用你指定的堆栈大小,并且只需在UI中使用主UI线程与处理程序或任何你想用来与之交互的机制来“发布”更改…

希望这可以帮助…

问候!

原文链接:https://www.f2er.com/android/312849.html

猜你在找的Android相关文章