Я отправил простой solution для пользовательской обработки Android-сбоев давно. Это немного взломанный, но он работает на всех версиях Android (включая Lollipop).
Сначала немного теории. Основные проблемы, связанные с использованием обработчика исключенных обработчиков на Android, включают исключения, которые были выбраны в основном (aka UI) потоке. И вот почему.Когда приложение начнет система вызывает ActivityThread.main метод, который готовит и запускает Main looper вашего приложения:
public static void main(String[] args) {
…
…
Looper.prepareMainLooper();
…
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
Главной петлителя несет ответственность за обработку сообщений, размещенные в потоке пользовательского интерфейса (включая все сообщения, связанные с оказанием UI и взаимодействием). Если исключение выбрано в потоке пользовательского интерфейса, оно будет улавливаться вашим обработчиком исключений, но поскольку вы не используете метод loop()
, вы не сможете показать какой-либо диалог или активность для пользователя, так как никто не может обработать пользовательский интерфейс сообщения для вас.
Предлагаемое решение довольно простое. Мы запускаем метод Looper.loop
самостоятельно и окружаем его с помощью блока try-catch. Когда исключение поймано, мы обрабатываем его, как мы хотим (например, запустите нашу пользовательскую активность отчета) и снова вызовите метод Looper.loop
.
Следующий метод демонстрирует этот метод (он должен быть вызван из Application.onCreate
слушателя):
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);
}
}
}
Как вы можете видеть неперехваченный обработчик исключений используются только для исключения придачи фоновых потоков. Следующий обработчик перехватывает эти исключения и распространяет их в поток пользовательского интерфейса:
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);
}
});
}
}
Пример проекта, который использует этот метод доступен на моем GitHub репо: https://github.com/idolon-github/android-crash-catcher
Можете ли вы поделиться код для того же .. –
Если вы хотите зарегистрировать свои исключения, посмотрите http://acra.ch/. ACRA позволяет отправлять отчеты об ошибках в Google-Doc или вам через E-Mail. –
@Alexander Или вы можете просто использовать Google Analytics для Android и регистрировать все исключения, которые вы хотите ... –