6

Вопрос по android – Как мне остановить зомбирование моего приложения после обработки необработанного исключения?

Я обрабатываю любые неперехваченные исключения, которые возникают в моем приложении, через:

Thread.setDefaultUncaughtExceptionHandler(this);

где это мой лаунчер Activity, реализующий UncaughtExceptionListener. Я обрабатываю исключение и отправляю его на свой сервер журналов, но мое приложение не заканчивается. Он просто бежит как зомби, пока не нажата кнопка возврата домой или назад. Как я могу убить процесс после обработки исключения?

Edit
Вот тестовое и рабочее действие, которое генерирует необработанное исключение, которое должно быть перехвачено (потоком) и обработано. Тост никогда не публикуется, и процесс регистрируется как исключение.

class TestActivity extends Activity implements UncaughtExceptionListener {

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Thread.setDefaultUncaughtExceptionHandler(this);
        throw new RuntimeException("I'm a destuctive booger.");

        setContentView(R.layout.activity_test);
    }

    @Override public void uncaughtException(Thread thread, Throwable toss) {
        Log.e(TAG, "An uncaught exception has been recieved.", toss);
        Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show();
    }
}
  • @MisterSquonk Здесь я обновил свой вопрос примером, который все еще правильно показывает мою проблему.

    от ahodder
  • Извините, я не понимаю. Вы говорите, чтоthis твой пусковойActivity так что если метод-обработчик является частьюActivityдля того, чтобы справиться с этим, у вас должен быть «бегущий»;Activity, Дело в том, чтоActivity является косвенным подклассомContext означает (в терминах ООП)Activity ЭтоContext.

    от Squonk
  • Что жfinish() работает, но лучшее, что я придумал для предупреждения пользователя, это использоватьNotificationManager отправить строку состоянияNotification с помощьюgetApplicationContext() дляContext, К сожалению, это означает необходимость предоставленияPendingIntent обрабатывать, когда пользователь нажимает на само уведомление. Извините, я больше ничего не могу заставить работать.

    от Squonk
  • Вызовfinish() в методе обработчика. Возможно, вы также захотите предоставить всплывающее диалоговое окно для информирования пользователя.

    от Squonk
  • @MisterSquonk, не могу, мой контекст обнуляется. Сначала у меня было сообщение о критической ошибке, но тост не будет создан. Затем я попробовал широковещательный приемник, и он тоже не работал.

    от ahodder
  • 0

    Не уверен

    что есть более мягкий способ решения этой проблемы, но вы можете попробовать:

    import android.os.Process;
    
    Process.killProcess(Process.myPid());
    

  • 1

    Я провел некоторое тестирование с вашим примером кода и обнаружил, что

    finish() будет работать сuncaughtException(), Однако он молчит, поэтому не дает никаких отзывов пользователю, и, как и вы, я не смог вызватьToast или любое другое визуальное окно сообщения, даже используяgetApplicationContext().

    Единственный способ отправить любой отзыв, который мне удалось получить, - это использоватьNotificationManager отправить строку состоянияNotification с помощьюgetApplicationContext() дляContext.

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

    Однако было бы возможно создать различные базовыеActivity возможно с темой диалога, которая будет открыта и объяснит сбой.