Android catch exception non gérée et afficher la boîte de dialogue
Je veux gérer une exception non gérée dans mon application, sans les bibliothèques de tiers.
Donc j'écris un code.
Activité :
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Thread.setDefaultUncaughtExceptionHandler(new ReportHelper(this));
throw new NullPointerException();
}
Mon accident gestionnaire :
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.widget.Toast;
/**
* Created by S-Shustikov on 08.06.14.
*/
public class ReportHelper implements Thread.UncaughtExceptionHandler {
private final AlertDialog dialog;
private Context context;
public ReportHelper(Context context) {
this.context = context;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Application was stopped...")
.setPositiveButton("Report to developer about this problem.", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
})
.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//Not worked!
dialog.dismiss();
System.exit(0);
android.os.Process.killProcess(android.os.Process.myPid());
}
});
dialog = builder.create();
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
showToastInThread("OOPS!");
}
public void showToastInThread(final String str){
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(context, "OOPS! Application crashed", Toast.LENGTH_SHORT).show();
if(!dialog.isShowing())
dialog.show();
Looper.loop();
}
}.start();
}
}
Quand je commence application comme vous le voyez je m'avaient envoyé NullPointerException. Toast
dans ma logique de gestion a été montré, et de dialogue a été montré trop. MAIS! Dialogue clics n'était pas de la manipulation correcte. Je veux dire de la logique dans onClick
méthode n'a pas été travaillé. Quel est le problème et comment je peux résoudre ce problème?
Définir ce que n'est pas correct? Ce qui s'est passé et ce qui a été le comportement à adopter dans votre onClick comportement?
Qu'attendez-vous et que faites-vous voir ? c'est à dire pourquoi vous dites "il n'est pas le travail"?
j'attends que la boîte de dialogue se ferme et l'application sera terminé, appuyez sur la bouton "Exit".
comportement attendu je descript en réponse précédente à ben75. Dialogue a juste montré, mais les clics ne sont pas manipulés.
Aussi j'ai ce problème. Avez-vous trouvé la solution?
Qu'attendez-vous et que faites-vous voir ? c'est à dire pourquoi vous dites "il n'est pas le travail"?
j'attends que la boîte de dialogue se ferme et l'application sera terminé, appuyez sur la bouton "Exit".
comportement attendu je descript en réponse précédente à ben75. Dialogue a juste montré, mais les clics ne sont pas manipulés.
Aussi j'ai ce problème. Avez-vous trouvé la solution?
OriginalL'auteur Sergey Shustikov | 2014-06-08
Vous devez vous connecter pour publier un commentaire.
Dans mon cas, j'ai déménagé
AlertDialog.Builder
dans le thread exécuter la fonction comme ceci:et toutes les chose fonctionne parfaitement.
Espérons que cette aide vous.
Lors de la première exception se produire, je vois alertdialog et avec bouton de fermeture à l'écoute, tuer mon application. Que pensez-vous des moyens à 2-3 exceptions?
Je veux dire que le BRAS de l'envoyer à notre gestionnaire d'exception 2-3 fois
uncaughtException(Thread thread, Throwable ex)
OriginalL'auteur Naruto Uzumaki
Selon ce post, l'état de l'application est inconnue, quand
setDefaultUncaughtExceptionHandler
est appelé. Cela signifie que votre onClick les auditeurs ne peuvent pas être plus active.Pourquoi ne pas utiliser cette méthode:
et supprimer ReportHelper la mise en œuvre de la
Thread.UncaughtExceptionHandler
interface.Votre méthode de pas explicitement d'intercepter les exceptions peuvent être vus comme un anti-modèle.
Si je supprime mon ReportHelper j'ai une erreur de compilation car
Thread.setDefaultUncaughtExceptionHandler
passer le paramètre qui implémenteThread.UncaughtExceptionHandler
. J'espère que vous avez raté cette.J'ai mis le Journal dans
uncaughtException(Thread thread, Throwable ex)
et je vois la magie de comportement. cette méthode appelle 3 fois à partir de différents threads.OriginalL'auteur Martin Konecny
Depuis une exception se produit sur l'INTERFACE utilisateur-Thread: l'état de ce fil est probablement inattendu
Donc, essayez simplement dans votre gestionnaire de clic :
OriginalL'auteur ben75