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

6

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

<code>Thread.setDefaultUncaughtExceptionHandler(this);
</code>

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

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

<code>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();
    }
}
</code>
@MisterSquonk, не могу, мой контекст обнуляется. Сначала у меня было сообщение о критической ошибке, но тост не будет создан. Затем я попробовал широковещательный приемник, и он тоже не работал. ahodder
Вызовfinish() в методе обработчика. Возможно, вы также захотите предоставить всплывающее диалоговое окно для информирования пользователя. Squonk
Извините, я не понимаю. Вы говорите, чтоthis твой пусковойActivity так что если метод-обработчик является частьюActivityдля того, чтобы справиться с этим, у вас должен быть «бегущий»;Activity, Дело в том, чтоActivity является косвенным подклассомContext означает (в терминах ООП)Activity ЭтоContext. Squonk
@MisterSquonk Здесь я обновил свой вопрос примером, который все еще правильно показывает мою проблему. ahodder
Что жfinish() работает, но лучшее, что я придумал для предупреждения пользователя, это использоватьNotificationManager отправить строку состоянияNotification с помощьюgetApplicationContext() дляContext, К сожалению, это означает необходимость предоставленияPendingIntent обрабатывать, когда пользователь нажимает на само уведомление. Извините, я больше ничего не могу заставить работать. Squonk

Ваш Ответ

2   ответа
1

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

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

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

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

0

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

import android.os.Process;

Process.killProcess(Process.myPid());

Похожие вопросы