Tengo una aplicación con una interfaz de usuario muy compleja, que contiene muchos layouts
anidados en otro. Al crear otro diseño, que he cogido un StackOverflowError
Android: aumentar el tamaño de la pila de llamadas
Se pregunta, he creado dos ejemplos de prueba:
1) la aplicación Hola mundo con los siguientes xml
para la actividad principal
<?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>
causas StackOverflowError mientras dibujando el diseño (porque cada diseño recursivamente dibuja sus hijos)
2) El siguiente caso de prueba
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);
}
}
causas StackOverflowError
en la profundidad de aproximadamente 260-270 llamadas.
Cada llamada del elemento de la pila para el segundo caso de prueba tarda de 4 bytes para el remite + 4 bytes
para el parámetro = 8 bytes
. Es posible que Dalvik's
VM guarde un poco más de información en cada elemento, pero incluso 16 bytes per element * 260 calls = about 4Kbytes
para el tamaño máximo total de la pila. Esto no parece suficiente.
¿Hay alguna manera de aumentar el tamaño máximo de la pila?
Cierto, y creo que esta es una buena respuesta, aunque no creo que se garantice que respete el tamaño de la pila. probablemente sea mejor evitar la situación por completo si es posible. –
Totalmente de acuerdo, pero es bueno saber que es posible si es necesario como último recurso ... –