Я хочу установить глобальный обработчик неперехваченных исключений для всех потоков в моем приложении Android. Итак, в моем Application
подклассе я установил реализацию Thread.UncaughtExceptionHandler
обработчика по умолчанию для неперехваченных исключений.
Thread.setDefaultUncaughtExceptionHandler(
new DefaultExceptionHandler(this));
В моей реализации я пытаюсь отобразить AlertDialog
соответствующее сообщение об исключении.
Однако, похоже, это не работает. Всякий раз, когда возникает исключение для любого потока, который не обрабатывается, я получаю стандартный диалог ОС по умолчанию («Извините! -Приложение-остановлено-неожиданно диалог»).
Каков правильный и идеальный способ установить обработчик по умолчанию для неперехваченных исключений?
Ответы:
Это должно быть все, что вам нужно сделать. (Убедитесь, что вы остановили процесс позже - все может быть в неопределенном состоянии.)
Первое, что нужно проверить, - это все еще вызывается обработчик Android. Возможно, ваша версия вызывается, но завершается неудачно, и system_server показывает общий диалог, когда видит сбой процесса.
Добавьте несколько сообщений журнала вверху обработчика, чтобы увидеть, попадает ли он туда. Распечатайте результат getDefaultUncaughtExceptionHandler, а затем выбросьте неперехваченное исключение, чтобы вызвать сбой. Следите за выводом logcat, чтобы узнать, что происходит.
источник
Я давно опубликовал простое решение для пользовательской обработки сбоев Android. Это немного взломано, но работает на всех версиях Android (включая Lollipop).
Сначала немного теории. Основные проблемы, возникающие при использовании обработчика неперехваченных исключений в Android, связаны с исключениями, возникающими в основном (также известном как пользовательский интерфейс) потоке. И вот почему. Когда приложение запускается, система вызывает метод ActivityThread.main, который подготавливает и запускает главный цикл вашего приложения:
public static void main(String[] args) { … … Looper.prepareMainLooper(); … Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
Главный лупер отвечает за обработку сообщений, размещенных в потоке пользовательского интерфейса (включая все сообщения, связанные с отображением и взаимодействием пользовательского интерфейса). Если в потоке пользовательского интерфейса выбрасывается исключение, оно будет перехвачено вашим обработчиком исключений, но, поскольку вы не работаете,
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.
источник
java.lang.RuntimeException: Performing pause of activity that is not resumed
. Я считаю, что когда я пытаюсь запустить свой собственный лупер, система приостанавливает действие, которое вот-вот начнется? Я не уверен, но любая помощь будет оценена по достоинству. СпасибоЯ думаю, чтобы отключить это в вашем методе uncaughtException (), не вызывайте previousHandler.uncaughtException (), где previousHandler установлен
previousHandler = Thread.getDefaultUncaughtExceptionHandler();
источник
FWIW Я знаю, что это немного не по теме, но мы успешно использовали бесплатный план Crittercism . Они также предлагают некоторые дополнительные функции, такие как обработка исключения, чтобы приложение не зависало.
В бесплатной версии пользователь все еще видит сбой, но, по крайней мере, я получаю электронное письмо и трассировку стека.
Мы также используем версию для iOS (но я слышал от моих коллег, что она не так хороша).
Вот похожие вопросы:
источник
Не работает пока ты не позвонишь
android.os.Process.killProcess(android.os.Process.myPid());
в самом конце вашего UncaughtExceptionHandler.
источник