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 では、現在のアクティビティがわかっている必要があります。このメソッドを例外ハンドラーで使用するには、各アクティビティのonResume()メソッドでリセットされる現在のアクティビティへのポインターを Application クラスに保持できますが、メモリ リークが心配です。

キャッチされていない例外がスローされたときに AlertDialog を表示する好ましい方法は何ですか?

4

1 に答える 1

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);
    }
});

カスタム エラー ポップアップを取得するには、アクティビティごとにデフォルトのキャッチされない例外ハンドラを個別に設定する必要があると思います。詳細については、この投稿を参照してください。

于 2013-08-04T22:00:04.040 に答える