gpt4 book ai didi

Android:增加调用堆栈大小

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:35 27 4
gpt4 key购买 nike

我有一个具有非常复杂 UI 的应用程序,其中包含许多嵌套在另一个中的 layouts。在创建另一个布局时,我遇到了一个 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 的 VM 可能会在每个元素中保留更多信息,但即使是每个元素 16 字节 * 260 次调用 = 大约 4Kbytes 以获得最大总堆栈大小。这似乎还不够。

有什么方法可以增加最大堆栈大小吗?

最佳答案

您可能无法增加主 UI 线程中的调用堆栈大小(这是可以理解的,因为您应该在这里做尽可能少的事情),但您可以在单独的线程中使用Thread 对象的构造函数参数:

ThreadGroup group = new ThreadGroup("threadGroup");
new Thread(group, runnableObject, "YourThreadName", 2000000).start();

在这个例子中,我将堆栈大小从 8k(大约 260 次调用)增加到 2M(足以避免 StackOverFlowException,当然你可以添加任意数量,只要内存可以承受),所以最后,对于更多的读者来说,这是增加堆栈大小的方法,虽然不推荐,但在某些情况下实际上是必要的,例如具有大量递归调用的算法,当然还需要在 worker 中完成所有艰苦的工作线程(正如你应该做的那样)使用你指定的堆栈大小,并使用带有处理程序的主 UI 线程或任何你想用来与之交互的机制在 UI 中“发布”更改...

希望这有助于...

问候!

关于Android:增加调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com