都遇到過APP使用崩潰的情況,尤其是在線上的崩潰,我們無法看到崩潰信息,此時就需要對崩潰信息進(jìn)行收集。之前用的都是第三方的來進(jìn)行,最近項目中需要自己來實現(xiàn)此功能。
其實Google已經(jīng)為我們提供了全局捕獲異常機(jī)制:UncaughtExceptionHandler。
UncaughtExceptionHandler 是Thread類中定義的一個接口,Android中程默認(rèn)實現(xiàn)了該接口來處理異常信息并退出。
自定義捕獲異常
如果我們需要自己捕獲并處理異常信息,思路就是 UncaughtExceptionHandler 接口,并將其加入到對應(yīng)的Thread中,示例代碼如下:
//獲取系統(tǒng)默認(rèn)的處理類實例
Thread.UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();
//定義自己的錯誤信息處理類
Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//當(dāng)有異常信息時,需要在這里進(jìn)行處理,
if (oldHandler != null) {
oldHandler.uncaughtException(t,e);// 1
}
}
};
//設(shè)置為默認(rèn)的處理信息
Thread.setDefaultUncaughtExceptionHandler(handler);
通過以上代碼便可獲取到全局的異常信息,可在uncaughtException方法中對錯誤信息進(jìn)行保存等操作。
錯誤處理
- 當(dāng)把錯誤信息保存或發(fā)送到服務(wù)端后,還需對錯誤進(jìn)行處理,如代碼 1 處(以上代碼只是示例代碼,可根據(jù)自己的邏輯來對錯誤進(jìn)行處理)。如果不對錯誤進(jìn)行處理,程序?qū)o反應(yīng),造成ANR。是因為當(dāng)程序報錯時,UI線程中的looper將不在進(jìn)行消息輪詢,所以會造成程序ANR(附:我在測試時,等報錯將錯誤捕捉后試著調(diào)用了looper的loop靜態(tài)方法來重新開啟輪詢,程序是沒有崩潰并可以正常運行的,但程序此時再次報錯時,程序就會卡死ANR,不知道是為什么,還望路過的大神們指點)。
建議:一般在項目中報錯后會彈出錯誤提示并退出,退出時可以調(diào)用Application的onTerminate方法來實現(xiàn)程序關(guān)閉。這樣程序再次啟動時也不會有任何問題。當(dāng)然也可以關(guān)閉后重新打開APP。
渣渣一枚,以上如有錯誤,請各位大神指正(抱拳)。