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中"发布"更改...
希望这可以帮助...
问候!
| 归档时间: |
|
| 查看次数: |
7711 次 |
| 最近记录: |