} finally {
try {
if (bw != null) {
bw.close();//关闭缓冲流
}
} catch (IOException e) {
e.printStackTrace();
}
}
if (getLogsFileSize(fileName) >= 1f) {
sendToServer(fileName);
} else if (level == CRASH_LEVEL || level == ERROR_LEVEL || level == WARNING_LEVEL) {
sendToServer(fileName);
}
}
上面有一个巨顶的方法:
Thread.currentThread().getStackTrace()[5]
这行函数能够得离当前执行代码的指令。(注:不一定是5)
因为在执行命令时,指令栈保存当前线程最近执行的代码。
它的原理是这样的:
1、MainActivity : LogTool.d(xxx,xxx)
跳转-》
2、LogTool: d(xxx,xx){wirteToFile(xxx,xxx)}
跳转-》
3、LogTool:writeToFile(xxx){}
假如上面是一个指令栈,那么我就去获取这个栈的栈底元素 [1] MainActivity… 这一行,得到的是个StackTraceElement
对象。
得到该对象之后,我们可以将该指令反射,通过getClassName()
获取类名,通过getMethodName()
获取方法名、通过getLineNumber()
获取当前行数,就省的我们一步一步去找具体哪行了。
所以上面代码中的第5行只是我这边的情况,别的代码就要自己去推理具体在哪一行咯。
接下来就是上传到服务器,这里使用Okhttp,上传的格式是包括文件+一些附带String信息,
所以使用mutipart来提交表单,并且开启一个线程来提交。
/**
-
上传Log文件至服务器
-
@return
*/
public static void sendToServer(final