应用开发中对 Crash 进行处理

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