我有一个应用程序与非常复杂的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线程与处理程序或任何你想用来与之交互的机制来“发布”更改…
希望这可以帮助…
问候!