2012-04-05 15 views
6

estoy manejando las excepciones no detectadas que ocurren en mi solicitud a través de:¿Cómo evito que mi aplicación zombifique después de manejar una excepción no detectada?

Thread.setDefaultUncaughtExceptionHandler(this); 

eran esta es mi lanzador Actividad implementar UncaughtExceptionListener. Manejo la excepción y la envío a mi servidor de registro sin problemas, sin embargo, mi aplicación no termina. Simplemente corre como un zombie hasta que se presiona el botón de inicio o atrás. ¿Cómo puedo matar el proceso después de manejar la excepción?

Editar
Aquí está una prueba y la actividad laboral que se produce una excepción no detectada que ha de ser capturados (por hilo) y manipulados. La tostada nunca se publica y el proceso se vuelve zombie una vez que se registra la excepción.

class TestActivity extends Activity implements UncaughtExceptionListener { 

    @Override public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Thread.setDefaultUncaughtExceptionHandler(this); 
     throw new RuntimeException("I'm a destuctive booger."); 

     setContentView(R.layout.activity_test); 
    } 

    @Override public void uncaughtException(Thread thread, Throwable toss) { 
     Log.e(TAG, "An uncaught exception has been recieved.", toss); 
     Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show(); 
    } 
} 
+0

Llamar 'finish()' en el método del controlador. También es probable que desee proporcionar un cuadro de diálogo emergente para informar al usuario también. – Squonk

+0

@MisterSquonk, no puedo, mi contexto está anulado. Inicialmente tuve que ofrecer un mensaje de error crítico, pero la tostada no creará. Luego probé un receptor de transmisión y tampoco funcionó. – AedonEtLIRA

+1

Lo siento, no entiendo. Usted dice que 'this' es su' Activity' de lanzador, por lo que si el método del manejador es parte de una 'Activity', para poder manejarlo debe tener' 'Running'' Activity'. El hecho de que 'Activity' sea una subclase indirecta de' Context' significa (en términos de OOP) y 'Activity' IS es' Context'. – Squonk

Respuesta

1

hice algunas pruebas con el código de ejemplo y descubrió que finish() funcionará a partir uncaughtException(). Sin embargo, no da ningún comentario al usuario y, como usted, no pude invocar un Toast ni ningún otro cuadro de mensaje visual, incluso usando getApplicationContext().

La única forma de enviar cualquier información que yo era capaz de conseguir trabajo era utilizar NotificationManager para enviar una barra de estado Notification usando getApplicationContext() para la Context.

No pasé mucho tiempo en él, pero desafortunadamente parece que esto significa tener que proporcionar un PendingIntent para manejar cuando un usuario hace clic en la notificación en sí. Hacer esto con el mismo Activity podría obviamente arriesgar un bucle infinito si el Activity configurado para el PendingIntent es uno que genera una excepción no controlada.

Sin embargo, sería posible crear un Activity básico variable con un tema de diálogo que se abriría y explicar el bloqueo.

0

No estoy seguro si hay una manera más suave de hacer frente a este problema, pero puede probar:

import android.os.Process; 

Process.killProcess(Process.myPid()); 
Cuestiones relacionadas