app出現了問題,尤其是多線程問題,某個線程出了問題,很不好找,那是不是可以搞一個統一的處理類,將所有的異常信息都統一到一個地方呢,原本只是一個知識點,但我發現這里還可以
保存異常信息到本地或云端,統計異常信息等,所以就封裝了一個類
1 用法
開發者只需重寫接口中的handException 方法,就可以統一對異常信息進行處理了
具體怎么處理,就看個人的需求了,我這邊是就是如果主線程,就走重啟app流程,如果是子線程就忽略,當然如果比較重要,也可以走重啟app
用法很簡單 初始化一下就行:
CrashHandler.getInstance().init(new CrashHandler.CrashListener() {@Overridepublic boolean handException(Throwable ex) {//false : 不處理,true:自己處理return false;} });
2 看下具體的代碼吧
public class CrashHandler implements Thread.UncaughtExceptionHandler {public static final String TAG = "CrashHandler";/*** 系統默認的UncaughtException處理類*/private Thread.UncaughtExceptionHandler mDefaultHandler;private static CrashHandler INSTANCE;private CrashListener listener;private CrashHandler() {}public interface CrashListener {boolean handException(Throwable ex);}public static synchronized CrashHandler getInstance() {if (INSTANCE == null) {INSTANCE = new CrashHandler();}return INSTANCE;}public void init(CrashListener listener) {this.listener = listener;//獲取系統默認的UncaughtExceptionHandlermDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();Logger.d(TAG, "init mDefaultHandler : " + mDefaultHandler);Thread.setDefaultUncaughtExceptionHandler(this);}@Overridepublic void uncaughtException(@NonNull Thread thread, @NonNull Throwable ex) {boolean handle = handleException(ex);//開發者不處理,用默認的處理類兜底if (mDefaultHandler != null && !handle) {mDefaultHandler.uncaughtException(thread, ex);}}/*** 是否忽略,是否重啟,發送錯誤報告等操作可在此完成.* 注意,如果是主線程,是必須要重啟的*/private boolean handleException(Throwable ex) {boolean handle = false;if (listener != null) {//捕獲監聽中異常,防止外部開發者使用方代碼拋出異常時導致的反復調用try {handle = listener.handException(ex);Logger.e(TAG, "custom bug end ");} catch (Throwable e) {Logger.e(TAG, "initCustomBug: ", e);}}return handle;} }