Ich veröffentlichte die einfache solution für die benutzerdefinierte Behandlung von Android Abstürzen vor langer Zeit. Es ist ein wenig hacky, aber es funktioniert auf allen Android-Versionen (einschließlich der Lollipop).
Zuerst ein bisschen Theorie. Die Hauptprobleme bei der Verwendung des nicht abgefangenen Ausnahmebehandlers in Android werden mit den Ausnahmen geliefert, die im Haupttool (auch als UI-Thread bezeichnet) ausgelöst werden. Und hier ist warum.Wenn die App startet System ActivityThread.main Methode aufruft, die die Main looper Ihrer App bereitet und beginnt:
public static void main(String[] args) {
…
…
Looper.prepareMainLooper();
…
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
Hauptgreifer ist verantwortlich für die im UI-Thread gepostet Verarbeitung von Nachrichten (einschließlich aller Nachrichten an UI-Rendering und der Interaktion im Zusammenhang). Wenn eine Ausnahme im UI-Thread ausgelöst wird, wird sie von Ihrem Ausnahmebehandler abgefangen. Da Sie jedoch die Methode loop()
nicht mehr verwenden, können Sie dem Benutzer keinen Dialog oder keine Aktivität mehr anzeigen, da niemand mehr zur Verarbeitung der UI benötigt wird Nachrichten für Sie.
Die vorgeschlagene Lösung ist recht einfach. Wir betreiben Looper.loop
Methode von unserem eigenen und umgeben es mit Try-Catch-Block. Wenn eine Ausnahme abgefangen wird, verarbeiten wir sie wie gewünscht (z. B. starten Sie unsere benutzerdefinierte Berichtaktivität) und rufen Sie erneut die Methode Looper.loop
auf.
Die folgende Methode demonstriert diese Technik (es sollte aus dem Application.onCreate
Hörer aufgerufen werden):
private void startCatcher() {
UncaughtExceptionHandler systemUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
// the following handler is used to catch exceptions thrown in background threads
Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler(new Handler()));
while (true) {
try {
Looper.loop();
Thread.setDefaultUncaughtExceptionHandler(systemUncaughtHandler);
throw new RuntimeException("Main thread loop unexpectedly exited");
} catch (Throwable e) {
showCrashDisplayActivity(e);
}
}
}
Wie Sie sehen können der abgefangene Exception-Handler verwendet wird, nur für die im Hintergrund Fäden geworfen Ausnahmen. Die folgende Prozedur fängt diese Ausnahmen und breitet sie auf den UI-Thread:
static class UncaughtHandler implements UncaughtExceptionHandler {
private final Handler mHandler;
UncaughtHandler(Handler handler) {
mHandler = handler;
}
public void uncaughtException(Thread thread, final Throwable e) {
mHandler.post(new Runnable() {
public void run() {
throw new BackgroundException(e);
}
});
}
}
Ein Beispiel-Projekt, das verwendet diese Technik auf meinem GitHub Repo verfügbar: https://github.com/idolon-github/android-crash-catcher
Können Sie bitte den Code für das gleiche teilen .. –
Wenn Sie Ihre Ausnahmen protokollieren möchten, sehen Sie sich http://acra.ch/ an. Mit ACRA können Sie Fehlerberichte an ein Google-Dokument oder an Sie per E-Mail senden. –
@Alexander Oder Sie können einfach Google Analytics für Android verwenden und alle Ausnahmen protokollieren, die Sie möchten ... –