介紹
程序總有崩潰的時候,崩潰沒關係,只要找出問題解決就好。可是對於普通用戶手中的崩潰,咱們每每沒辦法及時獲取用戶當時的crash信息。這時候咱們就要用到異常處理器,經過實現UncaughtExceptionHandler
接口,重寫uncaughtException
方法來處理代碼內部未捕獲的異常,也就是運行崩潰異常。java
使用
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static volatile CrashHandler crashHandler;
private Context context;
private CrashHandler(){}
public void init(Context context){
this.context = context;
Thread.setDefaultUncaughtExceptionHandler(this);
}
public static CrashHandler getCrashHander(){
if (crashHandler == null){
synchronized (CrashHandler.class){
if (crashHandler == null){
crashHandler = new CrashHandler();
}
}
}
return crashHandler;
}
@Override
public void uncaughtException(Thread t, final Throwable e) {
//程序崩潰了,獲取錯誤信息 e.getMessage()
//能夠進行保存或者上傳到服務器
android.os.Process.killProcess(android.os.Process.myPid())
exitProcess(1)
}
}
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getCrashHander();
crashHandler.init(this);
}
}
其實重要的就是兩步:android
-
首先實現 UncaughtExceptionHandler
接口,而後在他的uncaughtException
方法中獲取異常信息,能夠進行保存或者上傳到服務器進行錯誤信息分析。 -
而後經過Thread的 setDefaultUncaughtExceptionHandler
方法,將當前類設置成線程默認的異常處理器,而後就能監聽到全部線程的錯誤信息了。
原理
通常狀況下,一個應用中所使用的線程都是在同一個線程組,而在這個線程組裏只要有一個線程出現未被捕獲異常的時候,JAVA 虛擬機就會調用當前線程所在線程組中的 uncaughtException()
方法。web
// ThreadGroup.java
public void uncaughtException(Thread t, Throwable e) {
if (parent != null) {
parent.uncaughtException(t, e);
} else if (Thread.getDefaultUncaughtExceptionHandler() != null) {
// TODO The spec is unclear regarding this. What do we do?
Thread.getDefaultUncaughtExceptionHandler().uncaughtException(t, e);
} else if (!(e instanceof ThreadDeath)) {
// No parent group, has to be 'system' Thread Group
e.printStackTrace(System.err);
}
}
而後這個方法就比較簡單了,當getDefaultUncaughtExceptionHandler()
方法所獲取的異常處理器不爲空時,就會把異常傳到uncaughtException方法中。因此咱們以前經過setDefaultUncaughtExceptionHandler
方法設置了異常處理器爲咱們本身的CrashHandler,異常就會回調給CrashHandler的uncaughtException
方法。服務器
本文分享自微信公衆號 - 碼上積木(Lzjimu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信