这是最早参加工作时候学习的一个技术,应用运行的时候遇到崩溃如何获取?
无论是Android还是iOS,应用异常在所难免,所以就需要处理异常情况下出现的崩溃情况。崩溃总是无法预知的,不可控的。那么捕获崩溃的意义在哪里呢?其实,捕获崩溃的意义很大,能通过捕获到的崩溃日志分析问题,继而解决问题,防止该异常在下一个版本中继续存在。版本的更新迭代就是一个添加功能,优化性能,解决异常的过程。最早的时候很奇怪,应用就崩溃了,怎么还能获取到异常信息并且保存呢?当时想的显然这是不可能实现的。但是通过了解了异常捕获和抛出的过程,可以发现异常的捕获及之后的一系列处理都是可控的。应用中异常会经常出现,只不过有的异常没有被捕获处理,这样就会导致应用崩溃。这个时候异常信息就交给系统虚拟机进行处理,虚拟机会Crash应用,出现崩溃的情况。我们捕获崩溃日志就是在异常交给虚拟机之前,应用本身获取一下日志信息,进而做一些保存或者上传的操作。实现获取异常日志,分析日志的操作。
就提实现非常简单,这里就以把崩溃日志保存成文件的简单方式为例,说明整个过程。创建捕获全局异常的类,捕获应用中未处理的异常,即崩溃情况:
<pre>
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance;
private Context ctx;
public static CrashHandler getInstance() {
if (instance == null) {
instance = new CrashHandler();
}
return instance;
}
public void init(Context ctx) {
this.ctx = ctx;
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
String logdir;
if (Environment.getExternalStorageDirectory() != null) {
logdir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "hbdLog";
File file = new File(logdir);
boolean mkSuccess;
if (!file.isDirectory()) {
mkSuccess = file.mkdirs();
if (!mkSuccess) {
mkSuccess = file.mkdirs();
}
}
try {
FileWriter fw = new FileWriter(logdir + File.separator + "error.log", true);
if (fw != null) {
fw.write(new Date() + "\n");
StackTraceElement[] stackTrace = arg1.getStackTrace();
fw.write(arg1.getMessage() + "\n");
for (int i = 0; i < stackTrace.length; i++) {
fw.write("file:" + stackTrace[i].getFileName() + " class:" + stackTrace[i].getClassName()+ " method:" + stackTrace[i].getMethodName() + " line:" + stackTrace[i].getLineNumber() + "\n");
}
fw.write("\n");
fw.close();
}
} catch (IOException e) {
Log.e("crash handler", "load file failed...", e.getCause());
}
}
arg1.printStackTrace();
System.exit(0);
}
}
</pre>
将捕获异常类应用到APP中,仅需要在Application中的OnCreate方法中添加两句话,使其生效:
<pre>
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this);
</pre>
网友评论