Как мне остановить зомбирование моего приложения после обработки необработанного исключения?
Я обрабатываю любые неперехваченные исключения, возникающие в моем приложении, через:
Thread.setDefaultUncaughtExceptionHandler(this);
где это мой лаунчер Activity, реализующий UncaughtExceptionListener. Я обрабатываю исключение и отправляю его на сервер журналов, но мое приложение не заканчивается. Он просто бежит как зомби, пока не нажата кнопка возврата домой или назад. Как я могу убить процесс после обработки исключения?
редактировать
Вот тестовое и рабочее действие, которое генерирует неперехваченное исключение, которое должно быть перехвачено (потоком) и обработано. Тост никогда не публикуется, и процесс регистрируется как исключение.
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();
}
}
2 ответа
Я провел некоторое тестирование с вашим примером кода и обнаружил, что finish()
будет работать с uncaughtException()
, Однако он молчит, поэтому не дает никаких отзывов пользователю, и, как и вы, я не смог вызвать Toast
или любое другое визуальное окно сообщения, даже используя getApplicationContext()
,
Единственный способ отправить любой отзыв, который мне удалось получить, - это использовать NotificationManager
отправить строку состояния Notification
с помощью getApplicationContext()
для Context
,
Я не тратил много времени на это, но, к сожалению, кажется, что это означает необходимость обеспечить PendingIntent
обрабатывать, когда пользователь нажимает на само уведомление. Делать это с тем же Activity
очевидно, может рискнуть бесконечный цикл, если Activity
набор для PendingIntent
это тот, который генерирует необработанное исключение.
Однако можно было бы создать Activity
возможно с темой диалога, которая будет открыта и объяснит сбой.
Не уверен, что есть более мягкий способ решения этой проблемы, но вы можете попробовать:
import android.os.Process;
Process.killProcess(Process.myPid());