2013-04-08 6 views
10

私はシンプルなセットアップがあります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 ...)。しかし、MainActivitybuttonにアタッチされているリスナーのOnClickListener.onClickメソッドで例外がスローされた場合、それはうまくいきません。状況は次のとおりです。

  1. 私は故意にNullPointerExceptionをスローするコードを実行します。
  2. CrashHandlerはそれを傍受し、notification(これを示します)を作成します。
  3. Androidはメッセージを表示しません(たとえば、表示されるはずの「アプリケーションがクラッシュしました」など)。
  4. MainActivityはフリーズされています。
  5. 通知をクリックして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に追加すると、アプリケーションはただちに終了し、通知は完全に機能します(残念ながら、私はこのソリューションを本番環境で使用できません)。

    1. はなぜOnClickListener.onClickNullPointer exceptionではなく、OSと一緒に凍結し、開始から他の活動を防止、アプリがクラッシュすることはありません。

は、I 2つの質問がありますか?

  • これを避けるにはどうすればよいですか、少なくとも、これらの条件でCrashActivityを開始するにはどうすればよいですか?
  • +0

    私は理解できるように、あなたは** onClick **からあなたのコードの一部を投稿するべきだと思います。 –

    答えて

    0

    コードが表示されていないと、CrashHandlerクラスをデバッグする必要があります。 JVMがこの

    void uncaughtException(Thread t, Throwable e) 
    

    ですべての例外を無視します「このメソッドが例外をスローした場合には、Java仮想マシンによって無視されます。」 (JavaDoc)。

    私はこれが答えではないと言っていますが、この方法で例外が発生する場合は、答えが可能です。

    関連する問題