详解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软件编程有所帮助。