2012-01-13 33 views
9

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 StackOverflowErrorAndroid: 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?

Respuesta

22

Es posible que no pueda aumentar el tamaño de la pila de llamadas en el subproceso principal de la interfaz de usuario (que es comprensible porque se supone que debe hacer la menor cantidad posible aquí), pero puede hacerlo en un subproceso separado haciendo uso de parámetros del constructor del objeto Tema:

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

con este ejemplo he aumentado mi tamaño de la pila de 8k (alrededor de 260 llamadas) a 2 M (suficiente para no conseguir el StackOverflowException, por supuesto, usted puede agregar todo lo que quiere siempre y cuando la memoria pueda llevarlo), así que al final, para otros lectores, esta es la forma en que puedes aumentar el tamaño de tu pila, aunque no se recomienda, en algunos casos es realmente necesario, por ejemplo, un algoritmo con recursi extenso. Ve y, por supuesto, haciendo todo el trabajo duro en un hilo de trabajo (como se supone que debe) con el tamaño de pila especificado y simplemente "publicando" cambios en las IU usando el hilo de UI principal con manipuladores o cualquier mecanismo que desee. utilizar para interactuar con él ...

espero que esto ayude ...

Saludos!

+0

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. –

+0

Totalmente de acuerdo, pero es bueno saber que es posible si es necesario como último recurso ... –

-1

Si necesita este diseño complejo (como muchos dudarán) todavía puede dibujarlo programáticamente en el método onCreate.

0

Definitivamente no desea anidar diseños entre sí de esa manera. Si se encuentra anidando tres o cuatro veces, la construcción de la vista se vuelve cada vez menos eficiente, lo que puede hacer que las transiciones de actividad comiencen y probablemente terminen en su caso antes de que se cree la vista. Que se verá raro o será un desperdicio completo de una transición de actividad.

Debe hacer que el diseño de su raíz sea un diseño relativo y tener todos los diseños de marcos como elementos secundarios del diseño relativo de raíz.

Cuestiones relacionadas