UncaughtExceptionHandler широко используется в приложении?
Я поставил UncaughtExceptionHandler
, так что я могу записывать трассировки стека на диск, когда мое приложение падает. Я установил этот обработчик так:
if (!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
exceptionHandler = new CustomExceptionHandler(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString(),
null, this);
Thread.setDefaultUncaughtExceptionHandler(exceptionHandler);
}
где CustomExceptionHandler
инвентарь UncaughtExceptionHandler
, Я держу экземпляр в моем Activity
поэтому я могу использовать его для некоторых других функций (удаление следов стека, их извлечение и т. д.).
Я называю вышеуказанный кусок кода в onCreate
из моего Activity
, но, кажется, срабатывает только в первый раз Activity
это запустить.
Я вижу Thread.setDefaultUncaughtExceptionHandler
хотя call является статическим, значит ли это, что я могу установить этот обработчик только один раз в своем приложении? Или я могу установить его на поток?
2 ответа
Из документов
* Sets the default uncaught exception handler. This handler is invoked in
* case any Thread dies due to an unhandled exception.
Да, этот обработчик является глобальным, и вам нужно установить его один раз для приложения
UncaughtExceptionHandler широко используется в приложении?
Да. Если вы установите его в действии, а действие уничтожено, код обработчика в действии может больше не существовать.
Я установил обработчик в Application-onCreate (не в Activity), чтобы он работал для всех Activity, которые принадлежат Application, для записи журналов сбоев.
Подробнее см. Как изменить сообщение о сбое в Android(если это возможно)
Вот код gpl-v3+ для моего крашлоггера, который записывает записи logcat в файл.
Это инициализируется в Application.onCreate, как это
public class AndroFotoFinderApp extends Application {
private LogCat mCrashSaveToFile = null;
@Override public void onCreate() {
super.onCreate();
mCrashSaveToFile = new LogCat(this, Global.LOG_CONTEXT, HugeImageLoader.LOG_TAG,
PhotoViewAttacher.LOG_TAG, CupcakeGestureDetector.LOG_TAG,
FotoLibGlobal.LOG_TAG, ThumbNailUtils.LOG_TAG, IMapView.LOGTAG,
ExifInterface.LOG_TAG, ImageMetaReader.LOG_TAG);
}
}
где константы Global.LOG_CONTEXT
, HugeImageLoader.LOG_TAG
... тэги логирования Android различных модулей моего кода используют вот так
Log.d(HugeImageLoader.LOG_TAG, "some log message from modul HugeImageLoader)