Afficher une boîte de dialogue dans " Thread.setDefaultUncaughtExceptionHandler`
Quand mon application android lancer une exception, je veux montrer un dialogue personnalisé pour dire à l'utilisateur il y a quelque chose de mal est arrivé, j'ai donc utiliser Thread.setDefaultUncaughtExceptionHandler
pour définir un gestionnaire global d'exception:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, final Throwable ex) {
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("There is something wrong")
.setMessage("Application will exit:" + ex.toString())
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//throw it again
throw (RuntimeException) ex;
}
})
.show();
}
});
}
}
Mais je l'ai trouvé il n'y a aucune exception levée, le AlertDialog
de ne pas s'afficher, au lieu de cela, l'application bloque et après un certain temps, il affichera une boîte de dialogue système:
X app is not responding. Would you like to close it?
Wait | OK
Que dois-je faire maintenant?
Mise à JOUR
Le journal:
11-16 12:54:16.017: WARN/WindowManager(90): Attempted to add window with non-application token WindowToken{b38bb6a8 token=null}. Aborting.
Il semble que l'erreur provient de new AlertDialog.Builder(getApplicationContext());
Mais c'est un gestionnaire d'exception dans Application
sous-classe, comment puis-je définir une instance d'activité?
Ce message s'affiche lorsque l'application est prendre trop de temps (il n'y a aucune exception n'est levée dans ce cas). Ma recommandation est d'essayer de déplacer vos lourdes tâches à une AsyncTask.
OriginalL'auteur Freewind | 2012-11-16
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser l'INTERFACE utilisateur de l'opération à partir d'ici. Juste de démarrer une autre activité/écran de démarrage. Passer une intention supplémentaire pour désigner crash et afficher la boîte de dialogue de l'activité.
Voir aussi:
Android UncaughtExceptionHandler qui instancie une AlertDialog pauses
Toast ne s'affiche pas dans UnCaughtExceptionHandler
Comment faire pour démarrer une activité de UncaughtExceptionHandler si c'est thread principal s'est écrasé?
Comment je le fais:
J'ai un BaseActivity qui s'étend de l'Activité, et dans le onCreate de l'activité que j'ai mis le UncaughtExceptionHandler. Toutes mes activités s'étendent de la BaseActivity au lieu de l'Activité.
Clés
Application.onCreate
, au lieu de cela, vous devez créer unBaseActivity
et le mettre sur leonCreate
méthode.System.exit(0)
SplashActivity
, car il sera détruit, au lieu de cela, nous pouvons passer des messages d'erreur ou persister dans le fichier.System.exit(1)
(ou toute valeur non nulle) sera meilleure que il indiquera anormale de sortie.à partir d'une application java point de vue oui à partir d'android point de vue, il n'a aucun effet. Vous aurez même pas avoir accès à l'appareil à un endroit où il se bloque, la plupart du temps.
OriginalL'auteur Abhishek Nandi
Il semble que la solution proposée ne fonctionne pas (au moins pour Android 4.0 et ci-dessus). Pour toute personne qui pourrait être intéressée par l'ouverture d'un
Activity
ou impliquant une sorte deUI
des éléments tels queDialogs
n'est pas possible. Après quelques recherches, j'ai réalisé que le maximum que vous pouvez fournir est unToast
message informant le journal de la livraison du serveur. En option, uneSharedPreferences
peut être utilisé pour indiquer le plantage de l'application, et sur le redémarrage de l'application, unDialog
peuvent être affichées en fonction de laSharedPreferences
valeur de l'attribut et à partir de là, livrer la déjà pris à l'exception (apparemment Accra utilise la même approche):L'exception peut être enregistré comme une chaîne de caractères lorsque l'application s'est écrasé avec de l'extrait de code suivant:
Pour résumer, afin de fournir de l'exception non interceptée à un serveur distant créer un personnalisé
UncaughtExceptionHandler
et surtout de conserver une référence à la valeur par défautUncaughtExceptionHandler
. Au lieu de brusquement, l'arrêt de la VM en appelantSystem.exit()
il est plus raisonnable de laisser Android gérer l'exception, selon la coutume les opérations sont effectuées. Je préfère définir le gestionnaire d'exception sur leApplication
côté:Dans le
CustomExceptionHandler
après l'exécution de la coutume comportement laissez Android traiter l'exception du défaut:Et voici un exemple de la façon de livrer de manière asynchrone un message au serveur:
OriginalL'auteur eldjon