原理:
應(yīng)用出現(xiàn)異常后积担,會由默認(rèn)的異常處理器來處理異常,
我們要做的就是把這個(gè)任務(wù)接管過來芝硬,自己處理異常蚜点,包括收集日志,保存到本地拌阴,然后上傳到服務(wù)器绍绘。
- 步驟
1.自定義類 實(shí)現(xiàn)Thread.UncaughtExceptionHandler 接口
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private ISave mSave;//設(shè)置日志的保存方式
private CrashHandler() { }//保證只有一個(gè)CrashHandler實(shí)例
/**
* 獲取CrashHandler實(shí)例 ,單例模式
*/
public static CrashHandler getInstance() {
return INSTANCE;
}
/**
* 初始化,,設(shè)置此CrashHandler來響應(yīng)崩潰事件
*
* @param logSaver 保存的方式
*/
public void init(ISave logSaver) {
mSave = logSaver;
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 當(dāng)UncaughtException發(fā)生時(shí)會轉(zhuǎn)入該函數(shù)來處理
*/
@Override
public void uncaughtException(final Thread thread, final Throwable ex) {
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
while (cause != null) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
printWriter.close();
String stringBuilder = "↓↓↓↓exception↓↓↓↓\n" +
writer.toString();
mSave.writeCrash(thread, ex, TAG, stringBuilder);
// 如果處理了,讓主程序繼續(xù)運(yùn)行3秒再退出陪拘,保證異步的寫操作能及時(shí)完成
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- 三方SDK
1.網(wǎng)易云捕
2.騰訊bugly
3.Bugtags
4.蒲公英
5.BugHD(fir.im)
6.Testin