У меня есть приложение с очень сложным пользовательским интерфейсом, содержащее множество layouts
, вложенных друг в друга. При создании другого макета я поймал StackOverflowError
Интересно, я создал два тестовых примера:
1) Привет, мир, приложение со следующим 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 bytes
для параметра = 8 bytes
. Возможно, что Dalvik's
VM хранит немного больше информации в каждом элементе, но даже 16 bytes per element * 260 calls = about 4Kbytes
для максимального общего размера стека. Этого не достаточно.
Есть ли способ увеличить максимальный размер стека?