2012-04-05 9 views
6

私は経由して自分のアプリケーションで発生するすべてのキャッチされない例外扱いしています:キャッチされていないExcepitionを処理した後、アプリケーションをゾンビ化から停止するにはどうすればよいですか?

Thread.setDefaultUncaughtExceptionHandler(this); 

が、これはUncaughtExceptionListenerを実装する私のランチャー活動であるでした。私は例外を処理し、それを私のログサーバーに送信します。ただし、アプリケーションは終了しません。自宅または戻るボタンが押されるまでゾンビのように動くだけです。例外を処理した後でプロセスを強制終了するにはどうすればよいですか?ここ

編集
はキャッチ(スレッドによる)と扱われるべきキャッチされない例外をスローテストと作業活動です。トーストは決して掲示されず、例外が記録されるとプロセスはゾンビになります。

import android.os.Process; 

Process.killProcess(Process.myPid()); 
+0

ハンドラメソッドで 'finish()'を呼び出します。また、ユーザーに知らせるためにポップアップダイアログを提供したいと思うかもしれません。 – Squonk

+0

@MisterSquonk、できません、私の文脈は否定されます。私は当初、重大なエラーメッセージを表示していましたが、トーストは作成されません。私はその後、放送受信機を試しても、どちらも動作しませんでした。 – AedonEtLIRA

+1

申し訳ありませんが分かりません。 'this'はあなたのランチャー' Activity'ですので、ハンドラメソッドが 'Activity'の一部である場合、それを処理するには'実行中の 'Activity'が必要です。 'Activity'が' Context'の間接サブクラスであるという事実は、 'Activity'が' Context'を意味する(OOPの意味で)ことを意味します。 – Squonk

答えて

1

私はあなたの例のコードでいくつかのテストを行なったし、finish()uncaughtException()から動作することを発見した。そこにこの問題に対処する穏やかな方法ですが、あなたは試す可能性がある場合

class TestActivity extends Activity implements UncaughtExceptionListener { 

    @Override public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Thread.setDefaultUncaughtExceptionHandler(this); 
     throw new RuntimeException("I'm a destuctive booger."); 

     setContentView(R.layout.activity_test); 
    } 

    @Override public void uncaughtException(Thread thread, Throwable toss) { 
     Log.e(TAG, "An uncaught exception has been recieved.", toss); 
     Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show(); 
    } 
} 
0

わかりません。しかし、あなたのように、私はToastまたはその他のビジュアルメッセージボックスを呼び出すことができませんでした。getApplicationContext()を使用しました。

フィードバックを送信する唯一の方法は、NotificationManagerを使用してNotificationContextの場合はを使用して送信することでした。

私はそれに多くの時間を費やすことはありませんでしたが、残念ながら、ユーザが通知自体をクリックしたときに対処するためにPendingIntentを提供する必要があると思われます。同じActivityでこれを行うと、PendingIntentに設定されたActivityが未処理の例外を生成するものであれば、明らかに無限ループの危険性があります。

多分、ダイアログテーマを開いてクラッシュを説明することで、様々な基本を作成することができます。

関連する問題