2014-09-18 56 views
1

我想覆蓋默認Thread.UncaughtExceptionHandler在我的整個應用程序,以推出新的錯誤顯示Activity時出了差錯。如何正確使用Thread.UncaughtExceptionHandler在所有情況下推出的活動?

我能夠編寫一些代碼並使其半工作,但有一個問題,我無法弄清楚如何解決。如果在onCreate()之後的任何時間發生未捕獲的異常,則在Thread.UncaughtExceptionHandler的類中可以啓動新的Activity。但是,如果在onCreate()中出現未捕獲的異常,或者在屏幕上繪製UI之前,我的顯示錯誤Activity不會啓動,並且我的應用程序只是在那裏掛起。

我可以通過保存默認Thread.UncaughtExceptionHandler並將未捕獲的Throwable傳遞給uncaughtException()來反轉此行爲。這會導致在其他活動的onCreate()中處理異常,但通過onCreate()之後的任何異常僅會啓動默認的「不幸的是,應用程序已停止」。對話框和我的錯誤顯示Activity不會啓動。

...對代碼!

public class MyApplication extends Application { 
    private Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; 
    private ExceptionRouter exceptionRouter = null; 

    public MyApplication() { 
     defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 
     exceptionRouter = new ExceptionRouter(); 
     Thread.setDefaultUncaughtExceptionHandler(exceptionRouter); 
    } 

    public class ExceptionRouter implements Thread.UncaughtExceptionHandler { 
     @Override 
     public void uncaughtException(Thread thread, Throwable throwable) { 
      launchErrorActivity(throwable); 

      // Uncommenting the following line makes what I want to do work in other Activities' onCreate() but not after 
      // Leaving the line commented out makes what I want to do work after other Activities' onCreate() but not in it 
      // defaultUncaughtExceptionHandler.uncaughtException(thread, throwable); 
     } 

     private void launchErrorActivity(Throwable throwable) { 
      Context context = getApplicationContext(); 
      Intent errorIntent = new Intent(context, ErrorActivity.class); 
      errorIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

      Bundle extras = new Bundle(); 
      extras.putSerializable("throwable", throwable); 
      errorIntent.putExtras(extras); 

      context.startActivity(errorIntent); 
     } 
    } 
} 

我已經驗證該行context.StartActivity(errorIntent);在所有情況下達到。

如何解決我的問題?

回答

0

有一次,我需要在異常後顯示對話框,並顯示如下所示的對話框。也許這個代碼可以幫助你。

public void uncaughtException(Thread thread, Throwable throwable) { 
    final AlertDialog.Builder builder = new AlertDialog.Builder(fragmentActivity); 
     new Thread() { 
      @Override 
      public void run() { 
       Looper.prepare(); 

       builder.setTitle(title); 
       builder.create(); 
       builder.setCancelable(false); 
       builder.setPositiveButton(positiveButtonText, 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
               int which) { 
           //some action 
          } 
         }); 
       builder.setMessage(message); 
       builder.show(); 

       Looper.loop(); 
      } 
     }.start(); 
} 
+0

我想啓動一個Activity,而不是顯示一個對話框。但是,如果您不介意,您在代碼中的哪個位置設置了未捕獲的異常處理程序? – BVB 2014-09-18 17:18:38

+0

我知道你想要開始活動,但我沒有足夠的時間來測試活動代碼。我在Application類中的onCreate方法中設置了處理程序。 – fisher3421 2014-09-18 17:23:01

+0

看起來,您的構建器依賴於FragmentActivity作爲上下文。你如何通過這個? – BVB 2014-09-18 17:24:03

相關問題