Android异常处理最佳实践
一个好的app异常处理机制我认为应该至少包含以下几个功能:
1.能把错误信息上传到服务器 让开发者可以持续改进app
2.错误信息至少应该包含是否在主进程是否在主线程等可以帮助程序员定位的信息
3.最好包含手机硬件及软件信息。
4.主进程引发的异常最好交由系统自己处理也就是让用户可以感知到那种(当然你也可以自己定义一套更有意思的感知系统对话框等,具体可参考各种有意思的404界面)
5.子进程引发的异常最好别让用户感知到。比如push之类的这种和用户感知弱关联的这种。最好发生异常就直接kill掉即可。不要再交给系统处理。
下面上代码。
packagecom.example.administrator.exceptiontest; importandroid.app.ActivityManager; importandroid.app.Application; importandroid.content.Context; /** *CreatedbyAdministratoron2015/12/9. */ publicclassBaseApplicationextendsApplication{ publicstaticContextmContext; //默认的异常处理 publicstaticThread.UncaughtExceptionHandlerdefaultUncaughtExceptionHandler; @Override publicvoidonCreate(){ super.onCreate(); mContext=this; //先取得默认的异常处理handler defaultUncaughtExceptionHandler=Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(newBaseUncaughtExceptionHandler()); } }
packagecom.example.administrator.exceptiontest; importandroid.app.ActivityManager; importandroid.content.Context; importandroid.os.Looper; /** *CreatedbyAdministratoron2015/12/9. */ publicclassUtils{ /** *判断是否在主线程中执行如果是返回true不是返回false */ publicstaticbooleanisInMainThread(){ //注意这个地方我们无法一定可以取得myLooper的值的比如说你的thread没有绑定消息循环 //那你的mylooper就返回的一定是null了,只有绑定了以后才会返回相应的值 returnLooper.myLooper()==Looper.getMainLooper(); } //判断是否是主进程如果是就返回true否则返回false publicstaticbooleanisMainProcess(Contextcontext) { returncontext.getPackageName().equals(getProcessName(context)); } //取得进程名 publicstaticStringgetProcessName(Contextcontext){ StringcurrentProcessName=""; intpid=android.os.Process.myPid(); ActivityManagermanager=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); for(ActivityManager.RunningAppProcessInfoprocessInfo:manager.getRunningAppProcesses()){ if(processInfo.pid==pid){ currentProcessName=processInfo.processName; break; } } returncurrentProcessName; } }
packagecom.example.administrator.exceptiontest; importjava.io.PrintWriter; importjava.io.StringWriter; importjava.io.Writer; /** *CreatedbyAdministratoron2015/12/9. */ publicclassBaseUncaughtExceptionHandlerimplementsThread.UncaughtExceptionHandler{ @Override publicvoiduncaughtException(Threadthread,Throwableex){ WriterresultWriter=newStringWriter(); PrintWriterprintWriter=newPrintWriter(resultWriter); ex.printStackTrace(printWriter); StringBuffersb=newStringBuffer(); sb.append("是否在主线程中发生异常"+Utils.isInMainThread()+"\n"); sb.append("是否在主进程中发生异常"+Utils.isMainProcess(BaseApplication.mContext)+"\n"); StringerrorReport=sb.toString()+resultWriter.toString(); //这个地方最好把收集到的错误信息日志上传至服务器便于开发者定位修改问题。 //如果是主进程发生了异常那还是交给系统自己默认的异常处理来做。让用户感知到,否则用户啥都不知道体验并不好 //你当然也可以自己定义特殊的错误提示比如一些有意思的dialog什么的 if(Utils.isMainProcess(BaseApplication.mContext)){ BaseApplication.defaultUncaughtExceptionHandler.uncaughtException(thread,ex); }else{ //如果是子进程发生异常不要给提示直接殺掉子進程最好別讓用戶感知到 android.os.Process.killProcess(android.os.Process.myPid()); } } }
以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。