android 異常捕獲-UncaughtExceptionHandler

boyan01發表於2019-02-20

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應用發生未捕獲異常之後,重啟應用到主頁面了。

相關文章