0

Я создал собственный обработчик исключений в классе, расширяющем приложение, используя 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, когда выбрано неперехваченное исключение?

+0

Если вы подумываете о замене экрана ANR по умолчанию - нет. – Shark

+2

Я думаю, что это релевантно http://stackoverflow.com/questions/9751088/how-do-i-display-a-dialog-in-android-without-an-activity-context – chancea

+0

@chancea Спасибо за ссылку, но эти решения, по-видимому, требуют фоновой службы в качестве контекста вместо Activity. –

ответ

0

Чтобы получить по умолчанию всплывающего окна ошибки, обработать исключение, а затем выполнить по умолчанию неперехваченного обработчик исключений:

final Thread.UncaughtExceptionHandler defaultHandler = 
    Thread.getDefaultUncaughtExceptionHandler(); 
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     doCustomHandlingHere(); 
     defaultHandler.uncaughtException(t,e); 
    } 
}); 

Чтобы получить всплывающее окно пользовательских ошибок, я считаю, вы должны установить неперехваченное исключение по умолчанию обработчик для каждого вида деятельности отдельно. См. this post.

Смежные вопросы