最新做的应用,发布之后用户反馈总是出现闪退,有时候会弹出“应用程序意外停止”,这时候就是应用程序发生Crash了,此时用户只能点击“强行关闭”. 用户这么说我只知道程序有地方出错了,但是具体地方让我去找那可是大海捞针啊.
这个甚是让人头疼,于是网上搜索一阵,看到关于应用处理crash的方法,
Java 中 Thread 类中有一个内部接口
/**当Thread因未捕获异常而突然中止,调用处理程序的接口 */ publicstaticinterfaceUncaughtExceptionHandler{ void uncaughtException(Thread thread, Throwable ex); }
/** *设置当线程未捕获到异常而异常终止,并且Thread挂掉是没有任何处理程序时所调用的默认处理程序 * @param handler * The handler to set or null. */ publicstaticvoidsetDefaultUncaughtExceptionHandler(UncaughtExceptionHandlerhandler){ Thread.defaultUncaughtHandler = handler; }
一般的应用程序都要有一个Crash反馈机制。一旦Crash发生,可以通过一种方法了解Crash的信息,开发者可以根据这些信息对代码进行修改。当程序崩溃时可以记录重要的信息以便恢复现场(类似天天动听),避免android系统本身弹出的提示框优化用户体验,或者对异常进行处理把收集到的信息传到服务器。
要捕获Crash 首先需要实现UncaughtExceptionHandler 接口,然后在主线程中调用该处理程序基于以上的原因
public class DefaultExceptionHandler implements UncaughtExceptionHandler{ private Context context=null; public DefaultExceptionHandler(Context context){ this.context=context; } public void uncaughtException(Thread thread,Throwable ex){ //收集异常信息 sendCrashReport(ex); //等待半秒 try{ Thread.sleep(500); }catch(InterruptedException e){ e.printStackTrace(); } //处理异常 handleException(); } private void sendCrashReport(Throwable ex){ StringBuffer exceptionStr=new StringBuffer(); exceptionStr.append(ex.getMessage()); StackTraceElement[] elements=ex.getStackTrace(); for(int i=0;i<elements.length;i++){ exceptionStr.append(elements[i].toString()); } //这里可以发送收集到的Crash信息到服务器 } private void handleException(){ //这里可以对异常处理 //可以记录主要的信息 //干脆直接杀死应用程序 System.exit(0); //或再次抛给系统处理 } }
我们只需要在主Activity中调用一次即可,不需要在所有地方都调用
运行上面代码,当Crash发生以后,Android 系统本身就不会出现提示强行停止的对话框了,系统会调用我们的程序,手机异常信息上传服务器