我想覆蓋默認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);
在所有情況下達到。
如何解決我的問題?
我想啓動一個Activity,而不是顯示一個對話框。但是,如果您不介意,您在代碼中的哪個位置設置了未捕獲的異常處理程序? – BVB 2014-09-18 17:18:38
我知道你想要開始活動,但我沒有足夠的時間來測試活動代碼。我在Application類中的onCreate方法中設置了處理程序。 – fisher3421 2014-09-18 17:23:01
看起來,您的構建器依賴於FragmentActivity作爲上下文。你如何通過這個? – BVB 2014-09-18 17:24:03