Android全局異常處理UncaughtExceptionHandler

開發(fā)中有些地方未注意可能造成異常拋出未能caught到,然后彈出系統(tǒng)對話框強(qiáng)制退出。這種交互不好,而且開發(fā)者也不能及時獲取到底哪里出問題,當(dāng)然可以接入第三方Crash分析平臺比如Bugly、instabug,其實也可以自己很簡單的實現(xiàn)全局異常處理。

未捕獲異常大多發(fā)生在在多線程環(huán)境中,子線程拋出的異常是不能用主線程中try….catch捕獲。可以給線程設(shè)置UncaughtExceptionHandler,當(dāng)出現(xiàn)異常時會回調(diào)UncaughtExceptionHandler中的uncaughtException(Thread t, Throwable e) 方法。設(shè)置可以為某個線程單獨設(shè)

thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

當(dāng)想給所有線程設(shè)置時使用

   Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

實現(xiàn)自己的UncaughtExceptionHandler

public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private static final String TAG = "CrashHandler";
    private Context mContext;
    volatile private static CrashHandler sCrashHandler;

    private CrashHandler(Context context) {
        mContext = context;
    }

    public static CrashHandler getInstance(Context context){
        if (sCrashHandler == null) {
            synchronized (CrashHandler.class){
                if (sCrashHandler == null) {
                    //使用Application Context
                    sCrashHandler=new CrashHandler(context.getApplicationContext());
                }
            }
        }
        return sCrashHandler;
    }


    @Override
    public void uncaughtException(Thread t, Throwable e) {
        if (BuildConfig.DEBUG) Log.d(TAG, "uncaughtException: "+t.getName()+" "+e.getMessage());
        //這里可以將異常信息保存或上傳
        //...

        //可根據(jù)情況選擇是否干掉當(dāng)前的進(jìn)程
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

這里自定義的CrashHandler 構(gòu)造時傳入并保存context,以便之后進(jìn)行異常處理操作,因為使用的單例模式,內(nèi)部有靜態(tài)實例,為了防止context引用Activity造成內(nèi)存泄露,因此使用application context。

在Application中注冊未捕獲異常處理器

public class CrashApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance(this));
    }
}

最后manifest中使用CrashApplication

    <application
        android:name=".CrashApplication"
        android:allowBackup="true"
        ...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • 執(zhí)行多線程并發(fā)任務(wù)的時候,如果任務(wù)類型相同,一般會考慮使用線程池,一方面利用了并發(fā)的優(yōu)勢,一方面避免創(chuàng)建大量線程得...
    德彪閱讀 23,715評論 2 19
  • 標(biāo)題和正文沒關(guān)系,這要事先聲明,我只是在通勤的火車上寫這篇文,僅此而已。能把簡書當(dāng)日記的人,我應(yīng)該是跟大多數(shù)人...
    可以啊煒仔閱讀 273評論 2 1
  • 家這個東西,從來都是定義得很模糊。而隨著人的成長,家也在慢慢變化著。 小時候的家,是農(nóng)舍,是村莊,是田野,是漫天遍...
    會游走的魚閱讀 352評論 0 0
  • 她是我的女老板。 我正在辦公呢,帶著兩歲的兒子來到我身邊。 “老板,公子,這是干嘛呢?” 老板春風(fēng)滿面,說,他要拉...
    69d3eb42f654閱讀 319評論 0 0

友情鏈接更多精彩內(nèi)容