Для тех, кто находит этот вопрос только сейчас, я не уверен, что какой-либо из приведенных выше ответов был правильным при публикации, но это не так. В настоящее время вы хотите создать новый класс, который реализует Thread.UncaughtExceptionHandler
, а в конструкторе сохранить Thread.getCurrentUncaughtExceptionHandler()
в поле, и вы вызываете его uncaughtException(Thread, Throwable)
в конце your uncaughtException(Thread, Throwable)
метод. Затем вы вызываете Thread.setUncaughtExceptionHandler()
из любого кода, создающего экземпляр вашего класса, часто MainApplication.onCreate
.
Таким образом, полный код будет выглядеть примерно так:
//MainApplication.java
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CustomUncaughtExceptionHandler cueh = new CustomUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(cueh);
}
}
//CustomUncaughtExceptionHandler.java
class CustomUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler oldHandler;
CustomUncaughtExceptionHandler() {
oldHandler = Thread.getDefaultUncaughtExceptionHandler();
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
"Errors", // Category
"MainActivity", // Action
"Force Close: "+ex.toString(), // Label
0); // Value
AnalyticsUtils.getInstance(MainApplication.this).dispatch();
if (oldHandler != null) {
oldHandler.uncaughtException(thread, ex);
else {
System.exit(1);
}
}
}
Вы также можете сохранить исходный обработчик необработанных исключений по умолчанию где-нибудь еще для восстановления позже (или добавить метод getOldHandler()
), если по какой-либо причине вы решите, что ваш код больше не будет выполняться.