2017-02-15 4 views
1

Javaを使用して(これはJavaの質問です)、アプリケーションクラスのデフォルト例外ハンドラを作成しました。スレッド:Androidでクラッシュする方法 - すべての例外/クラッシュを1か所でキャプチャする方法

public class MyApplication extends Application { 
@Override 
    public void onCreate() { 
     super.onCreate(); 
     AppInitialization(); 
    } 

    private void AppInitialization() { 
     defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
     Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler); 
    } 

    private UncaughtExceptionHandler defaultUEH; 

    // handler listener 
    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      ex.printStackTrace(); 
      // TODO handle exception here 
     } 
    }; 
} 

私の目標は何ですか? crashLyticsクラッシュレポートの追加情報を記録する必要があります。例外が発生すると、いつもフックuncaughtException(スレッドスレッド、Throwable ex)が呼び出されます。私はそれがクラッシュと例外(確かではない)のために動作すると仮定します。この上

3質問:

  1. これはcrashLyticsがイムは、デフォルトの例外ハンドラをoverrdingので、どのように動作するかに影響します。

  2. これによりアプリを続行できますか?これは必要ありません。私は例外をどこか他の場所に記録し、defaultexceptionHandlerが存在しないかのように続行します。さもなければ、QA回帰はバグを見て修正するのは難しいでしょう。 uncaughtException(thread、ex)の中からdefaultUEH.uncaughtException(thread、ex)を呼び出すと、ループし続けますか?

  3. どのスレッドがsetDefaultUncaughtExceptionHandlerに関連付けられていますか?これは、すべてのスレッド(例えば、メインスレッドのみ)で動作しますか?

明確にするために、すべてのクラッシュ/クラッシュ/例外に関する追加情報を送信する方法が必要です。どうやって ?

更新:here誰かが解決策を見つけましたが、この方法を使用すると、クラッシュサイクリックスは致命的な問題も報告しますか?

+0

Applicationクラスのサブクラスで今
public class DefaultUnCaughtExceptionHandlerDecorator implements UncaughtExceptionHandler { private UncaughtExceptionHandler mDefaultUncaughtExceptionHandler; //we will decorate the default handler to add functionality to it public DefaultUnCaughtExceptionHandlerDecorator(UncaughtExceptionHandler mDefaultUncaughtExceptionHandler) { this.mDefaultUncaughtExceptionHandler = mDefaultUncaughtExceptionHandler; } @Override public void uncaughtException(Thread t, Throwable e) { logToCrashLytics(); //add our crashlytics logging and keys here // we have added our crashlytics extra data, now invoke Crashlytics mDefaultUncaughtExceptionHandler.uncaughtException(t, e); } private void logToCrashLytics() { Crashlytics.setUserIdentifier(Model.getUserID());//or whatever. this will show directly on crashlytics dashboard a pretty element Crashlytics.setString("Some useful Info","user is logged in"); // or whatever you want, such as printing out singleton managers references or model info //dont use Crashlytics.Log(..) here. it wont work consistent. } 

}

crashlytics AFTERがインストールされているが、これを行います情報は必要ですか? – maxoumime

+0

クラッシュでビジネスロジックを送信したい。たとえば、アプリケーションでは、トークン、UUID、現在のタブなどのように、問題を再現しやすくすることができます。 – j2emanue

+0

私は、あなたが 'Crashlytics.log'を使って考えていますか?あなたがアプリのユーザーの行動、彼が開いた活動、彼が選択したタブなど、クラッシュで送信されるログを準備することができるこの方法...ちょうど考え – maxoumime

答えて

1

これをきれいに行う方法が見つかりました。クラッシュレポート中にログを送信する場合は、Crashlytics.logに注意してください。バージョンCrashlytics 2.3.14.151では一貫して動作していないようです。代わりにCrashlytics.setString(key、value)を使用します。 crashlytics.logはcrashlytics.logException(..)とうまく動作しているようです。

私が持っていたもう1つの質問は、それが非人道的な例外で動作するかどうかです。答えは「はい」です。自分でテストしました。

すべてのスレッドからすべての例外をキャッチします。

残りの考えはhereに似ています。 Personは、defaultExceptionHandlerよりもデコレータ・パターンを使用して、uncaughtExceptionメソッドに機能を追加しています。

これは私がそれを強化する方法である: - どのような追加のほんの不思議

Thread.setDefaultUncaughtExceptionHandler(new DefaultUnCaughtExceptionHandlerDecorator(Thread.getDefaultUncaughtExceptionHandler())); 
+0

シーケンスを変更してくれました。 –

関連する問題