En utilisant la gestion globale des exceptions avec "setUncaughtExceptionHandler" et "Toast"

J'essaie de créer un gestionnaire d'exception simple qui m'aidera à déboguer la demande. À l'heure actuelle, lorsque j'ai une exception, je suis forcé de me connecter avec le débogueur Eclipse simplement pour voir les détails d'exception.

Pour éviter que j'ai utilisé setUncaughtExceptionHandler pour gérer une exception non gérée et afficher un Toast sur l'exception. Malheureusement, cela ne fonctionne pas.

  • Comment obtenir le nombre de lignes de texte avant le rendu?
  • Détectez la mise à niveau de l'application Android et définissez la classe d'application booléenne pour afficher / masquer les EULA
  • Problème important android.support.v7.widget.CardView dans Eclipse
  • UnsatisfiedLinkError (méthode native introuvable)
  • Bauiger drag-sort-listview exemple simple
  • La meilleure façon d'intercepter une demande WebView dans Android
  • 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(); } }); } } 

    Essentiellement, j'ai fait un formulaire avec un seul bouton, en appuyant sur quoi, il proposerait une exception devision par zéro. Toutefois, en appuyant sur le bouton, le gestionnaire de toast global ne s'affiche pas. Au lieu de cela, le bouton reste orange (pressé) et rien ne se produit.

    Inutile de dire, si je commentai i = 5/0; Je vois le toast qui dit qu'un bouton a été pressé.

    Deux questions: 1) Pourquoi le toast ne montre-t-il pas dans le corps UncaughtExceptionHandler ? Comment le montrer? 2) Existe-t-il une alternative / meilleure façon de gérer l'exception globale? Je suppose que je pourrais installer aLogCat sur le simulateur d'Android et tout simplement enregistrer l'exception non saisie, mais il semble toutefois moins confortable – il faudra changer les applications juste pour voir les détails d'exception.

    Merci!

    3 Solutions collect form web for “En utilisant la gestion globale des exceptions avec "setUncaughtExceptionHandler" et "Toast"”

    Vous ne voyez rien parce que l'exception s'est produite sur votre thread UI et que la pile s'est déroulée tout le chemin. Il n'y a donc plus de Looper et il n'y a pas de support qui sert à afficher le Toast. Si vous souhaitez afficher les informations d'exception à l'écran, vous devrez probablement démarrer une autre activité dans un autre processus.

    Il y a aussi un problème avec votre UncaughtExceptionHandler. Vous devriez vraiment garder une référence à l'ancien et l'appeler à la fin de uncaughtException cela permet au système d'afficher le bouton Force Close.

    C'est possible. Vous devez le faire dans un autre fil
    Alors ça devrait être comme ça

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

    Je sais que c'est une vieille question, mais j'espère pouvoir sauver quelqu'un de la frustration et de la perte de temps.

    Qberticus a raison, vous ne pouvez pas lancer une Activité sur le même processus, mais vous pouvez tuer le processus actuel et avoir Android pour l'exécuter dans un nouveau:

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

    Consultez cette page pour un excellent exemple de travail:

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.