2

キャッチされていない例外が表示された場合に何らかのアクションを実行する必要がある Android ライブラリに取り組んでいます。

キャッチされていない例外ハンドラーを正常に設定し、必要なコードを実行しています。これは、いくつかの情報を Web サーバーに投稿することですが、私の部分が完了したら、Android が通常行うことをアプリに実行させたいと考えています。クラッシュしたことを知らせてからアプリを終了し、詳細を Google Play デベロッパー コンソールに投稿します。

現時点では、キャッチされていない例外がサーバーに正常に投稿されますが、アプリは実行されたままになりますが、スレッドのパーティーが消えたため、少し奇妙な状態になります。通常、キャッチされていない例外がスローされると、Android はアプリを閉じます.

以下は、キャッチされていない例外ハンドラーの実行方法です。

private static void setUnhandledExceptionHandler()
    {
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler()
        {
            @Override
            public void uncaughtException(final Thread thread, final Throwable) {
                CrashReporter.ReportUnhandledCrash(((Exception) ex));
                Looper.loop();
            }
        });
    }

基本的に、私がやりたいことは、未処理の例外ハンドラーを介してアプリをサーバーに投稿し、Android が通常行うのと同じ方法でアプリを終了することです。つまり、強制終了エラーを表示してアプリを閉じます。

4

2 に答える 2

3

GoogleAnalytics に追跡するときに同様の問題が発生しました。ほとんどの例外は、デフォルト ハンドラーで報告しようとすると失われました。そのため、それらをキャッシュして、次の起動時に報告しました。

アプリケーションをクラッシュさせるための 2 番目のトリック (これが質問に答えてくれることを願っています) は、「古い」DefaultUncaughtExceptionHandler を格納し、それに例外を渡すことです。

以下の onCreate メソッドは、私の Application クラスの 1 つです。

@Override
public void onCreate()
{
     super.onCreate();
     trackCachedException();
     setupExceptionHandling();
}


private void setupExceptionHandling()
{
    _systemExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.UncaughtExceptionHandler myHandler = new Thread.UncaughtExceptionHandler()
    {

        @Override
        public void uncaughtException(Thread thread, Throwable ex)
        {
            cacheException(thread.getName(), ex);
            if (_systemExceptionHandler != null)
            {
                _systemExceptionHandler.uncaughtException(thread, ex);
            }
        }
    };
    // Make myHandler the new default uncaught exception handler.
    Thread.setDefaultUncaughtExceptionHandler(myHandler);
}
于 2014-12-16T14:16:58.843 に答える
0

あなたがこれを行う方法を私が知る唯一の方法は、きれいでも快適でもないので、始める前に申し訳ありません...

操作の順序は次のとおりです。

  1. キャッチされなかった例外を保存する
  2. 以前に行ったように、例外をログに記録します
  3. set メソッドを null で呼び出して、キャッチされていない例外ハンドラーの登録を解除します。
  4. 保存された例外をスローする新しいスレッドを起動します。

同じ例外を効果的に 2 回スローしていますが、2 回目のスローで回復メカニズムを削除しています。

于 2014-12-16T13:47:10.313 に答える