最新做的应用,发布之后用户反馈总是出现闪退,有时候会弹出“应用程序意外停止”,这时候就是应用程序发生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 系统本身就不会出现提示强行停止的对话框了,系统会调用我们的程序,手机异常信息上传服务器