详解Android全局异常的捕获处理
在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug。实现这个功能我们需要依赖于UncaughtExceptionHandler这个类,UncaughtExceptionHandler是一个接口,在Thread中。里面只有一个方法uncaughtException。当我们注册一个UncaughtExceptionHandler之后,当我们的程序crash时就会回调uncaughtException方法,而uncaughtException方法带有两个参数,参数中就存放这crash信息。接下来只看写代码
packagehi.xiaoyu.crashhandler;
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.lang.Thread.UncaughtExceptionHandler;
importjava.util.Date;
importandroid.content.Context;
importandroid.os.Environment;
importandroid.util.Log;
publicclassCrashHandlerimplementsUncaughtExceptionHandler{
privatestaticCrashHandlerinstance;
publicstaticCrashHandlergetInstance(){
if(instance==null){
instance=newCrashHandler();
}
returninstance;
}
publicvoidinit(Contextctx){
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
*核心方法,当程序crash会回调此方法,Throwable中存放这错误日志
*/
@Override
publicvoiduncaughtException(Threadarg0,Throwablearg1){
StringlogPath;
if(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)){
logPath=Environment.getExternalStorageDirectory()
.getAbsolutePath()
+File.separator
+File.separator
+"log";
Filefile=newFile(logPath);
if(!file.exists()){
file.mkdirs();
}
try{
FileWriterfw=newFileWriter(logPath+File.separator
+"errorlog.log",true);
fw.write(newDate()+"\n");
//错误信息
//这里还可以加上当前的系统版本,机型型号等等信息
StackTraceElement[]stackTrace=arg1.getStackTrace();
fw.write(arg1.getMessage()+"\n");
for(inti=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();
//上传错误信息到服务器
//uploadToServer();
}catch(IOExceptione){
Log.e("crashhandler","loadfilefailed...",e.getCause());
}
}
arg1.printStackTrace();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
在Activity或者Application中注册一下即可
CrashHandlercrashHandler=CrashHandler.getInstance(); crashHandler.init(getApplicationContext());
这样就实现了Android全局异常的捕获处理,实现过程也比较简单,希望对大家学习Android软件编程有所帮助。