2010-07-03 13 views
11

Sto cercando di creare un gestore di eccezioni semplice che mi consenta di eseguire il debug dell'applicazione. In questo momento, quando ho un'eccezione, sono costretto a connettermi con il debugger di Eclipse solo per vedere i dettagli delle eccezioni.Utilizzo della gestione globale delle eccezioni con "setUncaughtExceptionHandler" e "Toast"

Per evitare che io abbia utilizzato setUncaughtExceptionHandler per gestire qualsiasi eccezione non gestita e visualizzare un Toast sull'eccezione. Sfortunatamente, questo non funziona.

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();    
      } 
     }); 

    } 
} 

Essenzialmente fatto un modulo con un singolo pulsante, premendo sul quale, sarebbe un'eccezione devision per zero. Tuttavia, la pressione del pulsante non provoca la visualizzazione del gestore globale del pane tostato. Invece, il pulsante rimane arancione (premuto) e non accade nulla.

Inutile dire che se commento fuori i = 5/0; Vedo il brindisi che dice che è stato premuto un pulsante.

Due domande: 1) Perché il brindisi non viene visualizzato nel corpo UncaughtExceptionHandler? Come si fa a mostrare? 2) Esiste un modo alternativo/migliore per la gestione globale delle eccezioni? Immagino che potrei installare aLogCat sul simulatore Android e semplicemente registrare l'eccezione non rilevata, a quanto pare, tuttavia, meno comoda - Avrò bisogno di passare le applicazioni solo per vedere i dettagli delle eccezioni.

Grazie!

+0

Se si inserisce Log.e ("TicTacToe", "Eccezione non gestita", ex) al posto di Toast e visualizza il logcat in modo simile a eclissi o DDMS, registra l'errore? –

+1

Non hai bisogno di debugger, solo la vista Logcat. E avrai bisogno di Eclipse per risolvere comunque i problemi. – yanchenko

+0

Woah @ Alex. Ero sicuro di dover essere connesso per vedere aLogCat. Molte grazie! – VitalyB

risposta

10

Non si vede nulla perché l'eccezione si è verificata sul thread dell'interfaccia utente e lo stack è stato srotolato fino in fondo. Quindi non c'è più Looper e non vi è alcun supporto che viene utilizzato per visualizzare il Toast. Se si desidera visualizzare le informazioni sulle eccezioni sullo schermo, è molto probabile che sia necessario avviare un'altra attività in un altro processo.

C'è anche un problema con il tuo UncaughtExceptionHandler. Dovresti davvero mantenere un riferimento a quello vecchio e chiamarlo alla fine di uncaughtException questo consente al sistema di visualizzare il pulsante Force Close.

+0

Grazie, questo lo spiega. Significa che questo processo è fatto per? Non posso impedirmi di chiudere a quel punto? – VitalyB

+0

Sì, praticamente.Il gestore di eccezioni non rilevate predefinito tenta di terminare il processo. Penso che lo facciano per una buona ragione e dovresti chiamarlo e lasciarlo fare. – Qberticus

+0

Vuoi dire che non è possibile mostrare la finestra di avviso in questa attività? – Gratzi

14

È possibile. Hai bisogno di fare dentro un altro thread
Allora dovrebbe essere come questo

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(); 
     } 
    }); 
+2

inizierà un'altra attività funzionerà con questo ??? Mi sta mostrando lo schermo nero – sheetal

+0

@sheetal sto affrontando lo stesso problema. Hai trovato una soluzione per lo stesso? Grazie in anticipo – Vishnu

+0

No non puoi ... Per avviare un'altra attività da questa discussione è necessario che l'attività venga dichiarata come un processo diverso in Manifest – sheetal

1

Lo so che è una vecchia questione, ma spero di poter salvare qualcuno dalla frustrazione e perdite di tempo.

Qberticus è giusto, non è possibile avviare un'attività sullo stesso processo, ma si può uccidere il processo in corso e hanno eseguire Android in uno nuovo:

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); 

riferiscono a this page per un impressionante esempio operativo:

Problemi correlati