10

私はアプリを開発していますが、たまにバックグラウンド ワーカー スレッドの 1 つに何らかの例外がキャッチされません。これらの例外はそのスレッドをクラッシュさせますが、UI スレッド上にないため、アプリは実行を続けます。バックグラウンド スレッドでこれらのキャッチされない例外を強制して、アプリ全体を強制的にクラッシュさせるにはどうすればよいですか? 同じコンテキスト クラッシュ情報 (スタック トレースなど) が利用できると便利です。

アプリをテスターに​​リリースしたときに応答しなくなることがないように、これを行いたいと考えています。代わりに、バックグラウンド スレッドにキャッチされていない例外がある場合、アプリはそのクラッシュ ハンドラーに移動し、レポートを送信します (私は ACRA を使用していますが、それは問題ではありません)。これは、黙って失敗するアプリよりも優れています。

4

3 に答える 3

2

遅い答えですが、私は同じ質問をしていました。

本番環境では Crashlytics を使用していますが、アプリが開発用にビルドされている場合は、いくつかのアサーションが有効になっており、エラーをログに記録すると実際にエラーがスローされるため、開発者は不正な動作を検出できます。

しかし、ご指摘のとおり、バックグラウンド スレッドでエラーをスローしてもアプリはクラッシュしません。

開発用にビルドするときにアプリがすぐにクラッシュするようにするには、メイン ルーパーで Handler を使用して、メイン スレッドで例外をスローします。

次のようになります。


public static void assertTrue(boolean condition, String msg) {
    if (condition) {
        return;
    }

    final IllegalStateException e = new IllegalStateException(message);
    if (BuildConfig.RELEASE) {
        Crashlytics.logException(e);
        return;
    }

    Log.e("ASSERT", message, e);
    if (Looper.getMainLooper() != Looper.myLooper()) {
        mMainThreadHandler.post(new Runnable() {
            @Override
            public void run() {
                throw e;
            }
        });
    }

    throw e;
}
于 2014-11-04T18:48:16.943 に答える
0

を実装するクラスで、キャッチされていない例外をキャッチできますjava.lang.Thread.UncaughtExceptionHandler

  • UncaughtExceptionHandler を実装するクラスを作成し、必要な動作をuncaughtExceptionオーバーライドされた関数に入れます。
    この関数では、ログをサーバーに送信したり、カスタム クラッシュ ダイアログをユーザーに表示したりするなど、任意の動作を実行できます。
  • アクティビティ/スレッドにThread.setDefaultUncaughtExceptionHandler();を追加します。例外ハンドラ クラスのインスタンスを指定します。


于 2013-07-07T10:28:02.930 に答える