私はシンプルなセットアップがありますAndroidのフリーズOnClickListener.onClick中にNullPointerExceptionがある(他のタスクを開始することはできません)
CrashHandler
からThread.UncaughtExceptionHandler
を実装するクラスを。CrashActivity
- ユーザレポートを送信できるアクティビティ。MainActivity
- ユーザーが対話する必要があるメインアプリです。その間AndroidのショーでIntent it = new Intent("CrashReporter" + SystemClock.currentThreadTimeMillis()); it.setClass(context, CrashActivity.class); it.setFlags(it.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
:
それのスレッドのMainActivity
またはいずれかの内のキャッチされない例外がある、CrashHandler
インターセプトそれとはCrashActivity
を開始する目的で通知を作成し、 「アプリケーションがクラッシュしました」というメッセージが表示され、ユーザーが「OK」をクリックすると、アプリケーションが閉じられ、ユーザーはnotification
をクリックします。 notification
をクリックすると、CrashActivity
が起動して表示されます。
このコードは、さまざまな状況で長時間動作しています(メインスレッドでクラッシュし、handler
でクラッシュし、背景でクラッシュしますthread
...)。しかし、MainActivity
のbutton
にアタッチされているリスナーのOnClickListener.onClick
メソッドで例外がスローされた場合、それはうまくいきません。状況は次のとおりです。
- 私は故意に
NullPointerException
をスローするコードを実行します。 CrashHandler
はそれを傍受し、notification
(これを示します)を作成します。- Androidはメッセージを表示しません(たとえば、表示されるはずの「アプリケーションがクラッシュしました」など)。
MainActivity
はフリーズされています。- 通知をクリックして
CrashActivity
を起動すると、黒い画面が表示され、すべてがフリーズします(目的のアクティビティは表示されません)。
Logcat
でもOnCreate
または私のコードのいずれかの前に、起動時にタイムアウトがあることを示しています。
I/ActivityManager(11826): START u0 {act=CrashHandler1196 flg=0x14000000 cmp=mycompany.myapp/.CrashActivity bnds=[0,102][720,230] (has extras)} from pid -1
W/KeyguardViewMediator(11826): verifyUnlock called when not externally disabled
W/ActivityManager(11826): Activity pause timeout for ActivityRecord{41f4d988 u0 mycompany.myapp/.MainActivity}
W/ActivityManager(11826): Launch timeout has expired, giving up wake lock!
W/ActivityManager(11826): Activity idle timeout for ActivityRecord{4225eeb8 u0 mycompany.myapp/.CrashActivity}
notification
をクリックする前に、私はADB
からアプリを殺す場合 、notification
作品完璧。notification
をクリックする前に、私はいくつかのクリックやジェスチャーが凍結されたアプリで作成した場合は、数秒後に私は
ANR
についてのメッセージが表示されます。私がクリックした場合E/ActivityManager(11826): ANR in mycompany.myapp (mycompany.myapp/.MainActivity) E/ActivityManager(11826): Reason: keyDispatchingTimedOut E/ActivityManager(11826): Load: 0.63/0.57/0.49
「はい、それを殺します」、
notification
をクリックすると、完全に動作します。- 通知を作成した直後に
System.exit
(-1)をCrashHandler
に追加すると、アプリケーションはただちに終了し、通知は完全に機能します(残念ながら、私はこのソリューションを本番環境で使用できません)。- はなぜ
OnClickListener.onClick
でNullPointer exception
ではなく、OSと一緒に凍結し、開始から他の活動を防止、アプリがクラッシュすることはありません。
- はなぜ
は、I 2つの質問がありますか?
CrashActivity
を開始するにはどうすればよいですか?
私は理解できるように、あなたは** onClick **からあなたのコードの一部を投稿するべきだと思います。 –