您的位置:首页 > 移动开发 > Android开发

安卓全局异常捕获

2016-10-27 14:07 155 查看
因为有个需求是在程序崩溃前发送http请求退出账号,所以写了个全局异常捕获。

后来想到正好帮我测试的同事是黑盒,而且我俩办公地点也不同,不好交流问题。就干脆顺便写个“易懂”的文件用来交流bug。

其实根本原因是这次没有服务器,否则直接上传服务器就更方便了。

在暴风雨来临前,跟我一起做一些事情吧!

接下来就是代码:

public class MyCrashHandler implements Thread.UncaughtExceptionHandler {
private static MyCrashHandler INSTANCE;
private Context context;
private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private MyCrashHandler() {
}
public static synchronized MyCrashHandler getInstance() {
if (INSTANCE == null)
INSTANCE = new MyCrashHandler();
return INSTANCE;
}
public void init(Context context) {
this.context = context;
}
public void uncaughtException(Thread thread, Throwable throwable) {
//做一些事情
String logPath;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
logPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + File.separator + "log";
File file = new File(logPath);
if (!file.exists()) {
file.mkdirs();
}
try {
FileWriter fw = new FileWriter(logPath + File.separator + "MyErrorLog.log", true);
StringBuilder erroInfo = new StringBuilder();
StackTraceElement[] stackTrace = throwable.getStackTrace();
erroInfo.append("---------------------------------------------" + "\n")
.append("---------------------------------------------" + "\n")
.append("崩溃时间:" + dataFormat.format(new Date()) + "\n")
.append("手机厂商:" + Build.MANUFACTURER + "\n")
.append("手机型号:" + android.os.Build.MODEL + "\n")
.append("系统版本:" + android.os.Build.VERSION.RELEASE + "\n")
.append("CPU_ABI:" + android.os.Build.CPU_ABI + "\n")
.append("CPU_ABI2:" + android.os.Build.CPU_ABI2 + "\n")
.append("-------------------错误信息-------------------" + "\n")
.append(throwable.getMessage() + "\n")
.append("-------------------所在位置-------------------" + "\n");
for (int i = 0; i < stackTrace.length; i++) {
erroInfo.append("|---文件名:" + stackTrace[i].getFileName() + "\n"
+ "     |---类名:" + stackTrace[i].getClassName() + "\n"
+ "             |---第" + stackTrace[i].getLineNumber() + "行,方法名:" + stackTrace[i].getMethodName() + "\n");
}
erroInfo.append("\n");
fw.write(erroInfo.toString());
fw.close();
// 上传错误信息到服务器
// uploadToServer();
} catch (IOException e) {
LogUtil.e("MyCrashHandler:load file failed");
}
}
LogUtil.e("程序异常退出:" + throwable.getMessage());
android.os.Process.killProcess(android.os.Process.myPid());
}
}


在Application中使用:在onCreate方法中调用以下方法

private void initCrashHandler() {
MyCrashHandler handler = MyCrashHandler.getInstance();
handler.init(getApplicationContext());
Thread.setDefaultUncaughtExceptionHandler(handler);
}


log文件会保存在   内存卡/log/MyErrorLog.log

多次的崩溃信息也会追加在这个文件里面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 异常 崩溃 捕获