未捕捉的异常会让应用Crash,如果是在用户处发生异常,我们无法得到日志,不好解决问题,友盟集成了错误日志收集功能,但我们也可以自己捕捉异常: 定义UnCaughtExceptionHandler,用于处理异常:
public class UnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
logToSdcard(thread,ex);
}
public static void logToSdcard(Thread thread,Throwable ex) {
String logFilePath = "";
FileWriter fw = null;
PrintWriter pw = null;
try {
logFilePath = Environment.getExternalStorageDirectory().getPath()+"/crash.log";
File logFile = new File(logFilePath);
if (!logFile.exists()) {
logFile.createNewFile();
}
fw = new FileWriter(logFile,true);
pw = new PrintWriter(fw);
pw.println(String.format("%s\t%s\t%s\t", new Date().toLocaleString(), thread.getName(), ex.toString()));
Throwable cause= ex.getCause();
StackTraceElement[] stackTraceElements=cause.getStackTrace();
for (StackTraceElement stackTraceElement:stackTraceElements)
{
pw.println(String.format("%s\t%s\t%s\t", stackTraceElement.getClassName(), stackTraceElement.getLineNumber(), stackTraceElement.getMethodName()));
}
pw.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(pw != null){ try { pw.close(); } catch (Exception e) { }}
if(fw != null){ try { fw.close(); } catch (Exception e) { }}
}
}
}
然后在Application中设置默认异常处理器:
Thread.setDefaultUncaughtExceptionHandler(
new UnCaughtExceptionHandler());