Uso de la gestión de excepciones globales con "setUncaughtExceptionHandler" y "Toast"

Estoy intentando crear un manejador simple de la excepción que me ayude a depurar la aplicación. En este momento, cuando tengo una excepción, me veo obligado a conectarme con el depurador Eclipse simplemente para ver los detalles de la excepción.

Para evitar que he utilizado setUncaughtExceptionHandler para manejar cualquier excepción no controlada y mostrar un Toast en la excepción. Desafortunadamente, eso no funciona.

public class TicTacToe extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { Toast.makeText(TicTacToe.this, "TOAST", Toast.LENGTH_LONG).show(); } }); setContentView(R.layout.main); Button continueButton = (Button) findViewById(R.id.cell01); continueButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int i = 5; i = 5 / 0; Toast.makeText(TicTacToe.this, "BUTTON", Toast.LENGTH_LONG).show(); } }); } } 

Esencialmente hice una forma con un solo botón, presionando sobre cuál, lanzaría una excepción de-por-cero. Sin embargo, al presionar el botón no se muestra el controlador de toast global. En su lugar, el botón permanece naranja (presionado) y no pasa nada.

No hace falta decir que si comento i = 5/0; Veo el brindis que dice que un botón fue presionado.

Dos preguntas: 1) ¿Por qué no se muestra el brindis en el cuerpo UncaughtExceptionHandler ? ¿Cómo hacer que se muestre? 2) ¿Existe una alternativa / mejor manera de manejar las excepciones globales? Supongo que podría instalar aLogCat en el simulador de Android y simplemente registrar la excepción no detectada, parece, sin embargo, menos cómodo – Tendré que cambiar las aplicaciones sólo para ver los detalles de la excepción.

¡Gracias!

No estás viendo nada porque la excepción ocurrió en tu hilo de interfaz de usuario y la pila se desenrolló hasta el final. Así que no hay más Looper y no hay soporte allí que se utiliza para mostrar el brindis. Si desea mostrar la información de excepción en la pantalla, es muy probable que tenga que iniciar otra actividad en otro proceso.

También hay un problema con su UncaughtExceptionHandler. Usted realmente debe mantener una referencia a la antigua y llamar al final de uncaughtException esto permite que el sistema para mostrar el botón de cierre de la fuerza.

Es posible. Necesitas hacerlo dentro de otro hilo
Entonces debería ser así

  Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(TicTacToe.this, "TOAST", toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); } }); 

Sé que es una vieja pregunta, pero espero que pueda salvar a alguien de la frustración y perder el tiempo.

Qberticus tiene razón, no puedes iniciar una Actividad en el mismo proceso, pero puedes eliminar el proceso actual y hacer que android lo ejecute en uno nuevo:

 Intent intent = new Intent(myContext, AnotherActivity.class); intent.putExtra("error", errorReport.toString()); myContext.startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); 

Consulte esta página para obtener un impresionante ejemplo de trabajo:

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.