Android 程式設計過程中發生了沒有被 catch 的異常後會怎麼辦,毫無疑問,應用會被強制關閉。
所以,一般為了保險起見,我們可以在 Application#onCreate
方法中,為執行緒設定預設的異常處理器。即:UncaughtExceptionHandler
於是,捕獲異常的程式碼可以這麼寫:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
Log.i(TAG, "uncaughtException: " + t.getName() + ", e :" + e.getMessage());
///可以將異常進一步處理
}
});
複製程式碼
然而,這樣處理還不夠!
當發生異常的是非UI執行緒時,這樣處理是可行的。但是當發生異常的是UI執行緒時,那麼這樣處理,在使用者的眼中,就是Activity卡死,且無法響應操作。
那麼怎麼在 UI Thread Crash之後重啟Activity呢,可以為 UI Thread 新增一個自己 UncaughtExceptionHandler
。
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
Log.i(TAG, "ui exception: " + t.getName() + ", e :" + e.getMessage());
Intent intent = new Intent(AppContext.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Process.killProcess(Process.myPid());
System.exit(0);
}
});
複製程式碼
這樣就可以在UI應用發生未捕獲異常之後,重啟應用到主頁面了。