Использование глобальной обработки исключений с помощью "setUncaughtExceptionHandler" и "Toast"
Я пытаюсь создать простой обработчик исключений, который поможет мне отладить приложение. Прямо сейчас, когда у меня есть исключение, я вынужден подключиться к отладчику Eclipse просто, чтобы увидеть подробности об исключении.
Чтобы избежать этого, я использовал setUncaughtExceptionHandler для обработки любого необработанного исключения и отображения Toast для исключения. К сожалению, это не работает.
public class TicTacToe extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
Toast.makeText(TicTacToe.this, "TOAST", Toast.LENGTH_LONG).show();
}
});
setContentView(R.layout.main);
Button continueButton = (Button) findViewById(R.id.cell01);
continueButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int i = 5;
i = 5 / 0;
Toast.makeText(TicTacToe.this, "BUTTON", Toast.LENGTH_LONG).show();
}
});
}
}
По сути, я сделал форму с помощью одной кнопки, нажав на которую, она выкинула бы исключение из-за нуля. Однако нажатие кнопки не приводит к отображению глобального обработчика тоста. Вместо этого кнопка остается оранжевой (нажата), и ничего не происходит.
Излишне говорить, что если я прокомментирую я = 5/0;, я вижу тост, который говорит, что нажата кнопка.
Два вопроса:
1) Почему не отображается тост в теге UncaughtExceptionHandler? Как заставить его показать?
2) Существует ли альтернативный/лучший способ для обработки глобальных исключений? Я предполагаю, что смогу установить aLogCat на симулятор Android и просто зарегистрировать неперехваченное исключение, но, тем не менее, он менее удобен - мне нужно будет переключать приложения, чтобы увидеть детали исключений.
Спасибо!
Ответы
Ответ 1
Вы ничего не видите, потому что исключение произошло в вашем потоке пользовательского интерфейса, и стек полностью развернут. Таким образом, больше нет Looper, и там нет поддержки, которая используется для отображения Toast. Если вы хотите отобразить информацию об исключении на экране, скорее всего, вам нужно будет запустить другое действие в другом процессе.
Также существует проблема с вашим UncaughtExceptionHandler. Вы действительно должны хранить ссылку на старую и называть ее в конце uncaughtException
, что позволяет системе отображать кнопку "Закрыть".
Ответ 2
Это возможно. Вам нужно сделать это в другом потоке
Тогда это должно быть как
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(TicTacToe.this, "TOAST", toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
}
});
Ответ 3
Я знаю, что это старый вопрос, но я надеюсь, что смогу спасти кого-то от разочарования и тратить время.
Qberticus прав, вы не можете запустить Activity в том же процессе, но вы можете убить текущий процесс и запустить Android в новом:
Intent intent = new Intent(myContext, AnotherActivity.class);
intent.putExtra("error", errorReport.toString());
myContext.startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
обратитесь к этой странице за потрясающий рабочий пример: