Глобальная обработка ошибок Android и отчетность - PullRequest
4 голосов
/ 21 апреля 2011

Есть ли способ зарегистрировать глобальный обработчик ошибок, который предотвратит сбой приложения? Отчеты о сбоях описаны здесь: Как получить данные о сбоях из моего приложения Android? . Одна мысль, которая у меня была, заключалась в том, чтобы расширить эти решения для учета в контексте приложения, чтобы можно было перенаправить на конкретную деятельность по созданию отчетов? Но не уверен, что контекст приложения действителен в этот момент, когда есть отчет о сбое?

Но как перенаправить пользователя на глобальное сообщение об ошибке «Активность» в случае сбоя? Есть ли какой-нибудь высокоуровневый способ регистрации обработчика ошибок, который будет перехватывать все ошибки и предотвращать сбои? Есть ли способ зарегистрировать такой обработчик, чтобы он предотвращал или переживал сбой, а затем перенаправлял пользователя на конкретное действие, которое будет отображать сообщение об ошибке, о котором идет речь?

Вот моя модификация обработчика ошибок:

1) Просто передайте applicationContext в конструктор как ctx

2) добавить reportError(stackTrace) метод для передачи управления на страницу сообщения об ошибке

private void reportError(String stackTrace){
        Intent i = new Intent(ctx, DisplayErrorActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.setAction("DISPLAY_ERROR_ACTIVITY");
        Bundle b = new Bundle();
        b.putString("STACKTRACE", stackTrace);

        i.putExtras(b); 
        try{
             Log.d("MyErrorHandler","reportError ctx="+ctx);
             ctx.startActivity(i); 
        } catch (Exception e) {
             Exception ex = e;
             e.printStackTrace();
        }

    }

И позвоните reportError ниже:

public void uncaughtException(Thread t, Throwable e) {
        Log.d("MyUncoughtExceptionHandler", "uncoughtException ctx="+ctx);
        String timestamp=getDateTime();
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        String filename = timestamp + ".stacktrace";
        Log.d("MyexceptionHanlder","UncoughtException: "+stacktrace);
        if (localPath != null) {
            writeToFile(stacktrace, filename);
        }
        if (url != null) {
            sendToServer(stacktrace, filename);
        }
        reportError(stacktrace);
       // defaultUEH.uncaughtException(t, e);

    }

Если я оставляю комментарий defaultUEH, он показывает обычный диалог сбоя. Без этого - пустой экран. Журнал указывает, что ErrorMessageActivity принудительно закрывается вместе с процессом.

Чтобы проверить, я просто положил деление на ноль в методе создания основной активности сразу после регистрации обработчика ошибок в потоке. Если бы у меня был блок try-catch, это не привело бы к сбою, но глобальный обработчик ошибок, похоже, не предотвращал сбои. Проверено ctx, и оно кажется действительным в отладчике.

Ответы [ 2 ]

6 голосов
/ 21 апреля 2011

При реализации ACRA мне никогда не удавалось начать новое действие после получения необработанного исключения. Похоже, что весь процесс переключен системой в особое состояние, не позволяющее ему разрешить любой новый ресурс.

Единственный вариант, который я нашел на данный момент, - это отправить уведомление в строке состояния, которое сохраняется системой после перезапуска приложения. Уведомление тогда вызывает намерение для диалоговой деятельности, когда пользователь выбирает это.

Алексей Яковлев более подробно изучил эту проблему и пришел к выводу, что может возникнуть вероятность запуска нового действия, когда происходит сбой в потоке, который не является потоком пользовательского интерфейса. Хотя мы не нашли достаточно простого обходного пути для непосредственного начала действия во всех случаях.

Я избавился от диалогового окна принудительного закрытия по умолчанию, убив сам процесс, не вызывая оригинальный обработчик необработанных исключений по умолчанию.

3 голосов
/ 21 апреля 2011

вы можете setUncaughtExceptionHandler для вашей темы.

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