Записать Stacktrace в FirebaseDatabase в UncaughtExceptionHandler, проблема с вызовом метода uncaughtException по умолчанию - PullRequest
0 голосов
/ 26 января 2020

В настоящее время я застрял с UncaughtExceptionHandler и базой данных Firebase в моем Android Kotlin приложении.

Мой план: в случае необработанного исключения зарегистрируйте трассировку стека в Google Firebase.

У меня уже есть BaseCompatActivity с UncaughtExceptionHandler. Все действия наследуются от этого класса.

Ниже представлена ​​единственная и интересная часть BaseCompatActivity:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val currentUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
    Thread.setDefaultUncaughtExceptionHandler({ thread, exception ->
        val exStackTraceString = StringWriter()
        exception.printStackTrace(PrintWriter(exStackTraceString))
        FirebaseDatabase.getInstance().getReference("/exception-log").push().setValue(exStackTraceString.toString()).addOnCompleteListener {
            currentUncaughtExceptionHandler.uncaughtException(thread, exception)
        }
    })
}

Все работает, кроме вызова метода по умолчанию для currentUncaughtExceptionHandler.uncaughtException (thread, исключение) потому что эта линия никогда не называется. Кажется, что полный слушатель никогда не вызывается. Это приводит к закрытому, непригодному для использования приложению после возникновения исключительной ситуации :-( Вход в базу данных Firebase работает. Единственная неисправность - это метод обратного вызова слушателя.

Я не хочу использовать System .exit (), потому что это нарушает цепочку исключений.

Вы можете мне помочь?

1 Ответ

0 голосов
/ 26 января 2020

Из документации Thread.setDefaultUncaughtExceptionHandler:

"Установить обработчик по умолчанию, вызываемый при внезапном завершении потока из-за необработанного исключения"

При вызове вашей базы данных Firebase используется асинхронный обратный вызов , Без дополнительной информации трудно быть уверенным, но, учитывая, что ваш пользовательский интерфейс застревает, что-то из вашего основного потока убивается. Вы можете сделать вызов, но результат не имеет потока для возврата, потому что поток был прерван.

Если вы используете Firebase, я бы посоветовал взглянуть на Crashlytics, они есть метод для обработки этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...