Я создал собственный обработчик исключений в классе, расширяющем приложение, используя Thread.setDefaultUncaughtExceptionHandler
, для печати трассировок стека исключенных исключений в файл. Я бы хотел, чтобы он также отображал пользовательское всплывающее окно ошибки пользователю, а не по умолчанию «К сожалению, сообщение [приложение] остановлено».Всплывающее окно ошибки пользовательского исключения
Следующий способ создает AlertDialog, который возвращается в главное меню при нажатии. Его можно запускать даже по фоновым потокам.
void alert(final String msg) {
final Activity activity = (Activity) getContext();
activity.runOnUiThread(new Runnable() {
public void run() {
new AlertDialog.Builder(activity)
.setCancelable(false)
.setMessage(msg)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
activity.startActivity(new Intent(activity, MainMenu.class));
}
})
.show();
}
});
}
Однако AlertDialog требует, чтобы текущая активность была известна. Чтобы использовать этот метод с обработчиком исключений, я мог бы держать указатель на текущую активность в классе Application, который сбрасывается в методе onResume()
каждого действия, но меня беспокоит утечка памяти.
Каков предпочтительный способ вызвать AlertDialog, когда выбрано неперехваченное исключение?
Если вы подумываете о замене экрана ANR по умолчанию - нет. – Shark
Я думаю, что это релевантно http://stackoverflow.com/questions/9751088/how-do-i-display-a-dialog-in-android-without-an-activity-context – chancea
@chancea Спасибо за ссылку, но эти решения, по-видимому, требуют фоновой службы в качестве контекста вместо Activity. –