2011-03-24 11 views
9

Estoy intentando aprender y probar excepciones en android y no puedo parecer para obtener información pasada try/catch, Thread.currentThread(). SetUncaughtExceptionHandler (new MyExceptionHandler()) y ACRA.Manejo de excepciones y ciclo de vida en Android?

Básicamente, quiero saber qué sucede cuando se lanza una excepción, ¿mata solo la actividad actual? ¿Qué pasa si mi aplicación tiene múltiples actividades y se mata en la 4ta actividad que está en la pila de actividades, mata solo a una?

Lo pido principalmente porque estoy arrojando un error y no está matando el programa completo sino reiniciándolo en alguna actividad intermedia del programa. (Estoy haciendo esto a propósito para obtener más información al respecto) Preferiría que el programa se muera, que reiniciar en mal estado, pero Android no tiene interruptor de matar (al menos que yo sepa).

Gracias

EDIT: Si androide recrea la pila, sabemos hasta dónde llega? o si usa create? o reanudar? ¿Qué pasa si las actividades previas en la pila necesitan la entrada del usuario?

Respuesta

2

Lo que he observado en el LogCat es que el tipo de Android almacena en caché los intentos e intenta reconstruir tu pila a partir de esos. Lo que quiero decir es que la pila de actividades consiste en Actividad A, B, C, D (D en la parte superior, A en la parte inferior) y una excepción en la Actividad D. Luego, el SO intenta reconstruir la pila disparando intenciones para A , luego B y luego C. Pero no estoy seguro

+0

Dado que no existe una aplicación en el sentido tradicional de escritorio, este comportamiento (si es correcto) sería muy lógico.Si hay un conjunto de actividades casi independientes, el conjunto no necesita morir horriblemente cuando una actividad explota. Eso sería similar a una sola aplicación de escritorio que derribe todo el sistema. – erichamion

+0

Mi problema es que en el proceso de recreación de la pila falta algo en el camino, y lo recrea erróneamente. (no recarga el DB) – Totic

+0

Estoy seguro de que, al recrear la actividad, se llama al método onCreate. Es posible que la creación de su actividad dependa de algunos datos que estaban disponibles anteriormente pero que no están presentes después del bloqueo. Lo que quiero decir es que antes solía almacenar una estructura de datos como una variable estática en una clase singleton y la usé para crear mi actividad. Después de la caída, vi que a veces la estructura de datos no estaba disponible para mi actividad y se procesaba correctamente – pankajagarwal

2

Mi impresión es que el marco de Android imprime un seguimiento de la pila de la excepción no detectada y luego reinicia la máquina virtual con todo menos la actividad que provocó la excepción. Por ejemplo, tuve una excepción de puntero nulo no detectada en una actividad y un servicio fijo de fondo en ejecución. Android intentó reiniciar la máquina virtual y reiniciar el servicio fijo, pero implementé incorrectamente el servicio para ver siempre el intento de iniciarlo, que es NULO al reiniciar, lo que provoca una segunda excepción inmediatamente después.

Además, al menos en Eclair y superior, Android intentará reiniciar un servicio después de ciertos bloqueos como una excepción no detectada en onStartCommand(). En ese caso, se llamará a onStartCommand() con el indicador START_FLAG_RETRY.

una idea de esto está aquí: http://groups.google.com/group/android-developers/msg/0eb714f48d534443

2

Android tiene ningún interruptor de la matanza

Usted puede tratar de System.exit (int), a partir de Java SE, que mata a la máquina virtual.

Si android recrea la pila, ¿sabemos [...] si utiliza create? o reanudar?

onCreate se llama (ver http://developer.android.com/images/activity_lifecycle.png)

Por cierto, una excepción mata el programa, pero el ActivityManager lo reinicia. Si las actividades previas requieren la entrada del usuario de la que depende la actividad frontal, debe incluirse en el paquete que se pone en la intención que inicia la actividad frontal, porque el sistema guarda el paquete y lo pasa de nuevo a la actividad al reiniciarlo .