安卓中的质量监控CrashHandler implements UncaughtExceptionHandler

何为质量监控,当我们的项目上线之后,用户下载到自己手机上,程序出现了没有捕获的异常,这些异常怎么解决,让程序崩溃吗,不能,在这种情况下,就用到了我们的质量监控。

捕获那些没有 try catch 的异常
需要自己的类实现UncaughtExceptionHandler 接口(未捕获异常handler接口)
捕获到异常信息之后 需要提示用户,(给客户提示信息,本质是更新界面控件,在工作线程中需要用looper 才能更新UI)需要把异常信息发送到服务器,以便下次升级版本的时候,修改异常。
系统强制KILL 掉应用程序,然后过两秒重新启动应用程序。

/** * 处理程序 错误 * * @author 甄 * */
public class CrashHandler implements UncaughtExceptionHandler {

    TApplication tApplication;

    public CrashHandler(TApplication tApplication) {
        super();
        this.tApplication = tApplication;
    }

    /** * 出异常了,没有加try catch的异常 不能加断点 */
    @Override
    public void uncaughtException
    (Thread thread, Throwable ex) {

        //得异常信息发到网上服务器
        //String string=ex.getMessage(); 这句信息太少,让程序员无法判断什么异常
        //用下面的这个 把异常信息转化成字符串 详细的信息
        StringWriter stringWriter=new StringWriter();
        PrintWriter printWriter=new PrintWriter(stringWriter);
        ex.printStackTrace(printWriter);
        String string=stringWriter.toString();
        Log.i("CrashHandler", "出错了4 "+string);
        // 启工作线程,toast是界面控件
        // 工作线程不能更新ui
        new Thread() {
            public void run() {
                // show 用到队列,主线程有looper,取消息放队列
                // 在这个工作线程中 需要自己手动添加looper
                Looper.prepare();
                Toast.makeText(tApplication, "网络不稳定,程序即将重启", Toast.LENGTH_LONG).show();
                Looper.loop();
            };
        }.start();

        try {
            Thread.currentThread().sleep(2000);
        } catch (Exception e) {
            // TODO: handle exception
        }

        Intent intent = new Intent(tApplication, MainActivity.class);
        // 不执行
        // tApplication.startActivity(intent);
        // 当前tash出异常,创建新的task
        PendingIntent pendingIntent = PendingIntent.getActivity(tApplication,
                100, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

        // 过一会儿执行pendingIntent 过两秒之后 启动MainActivity.class
        //获取闹钟管理器,通过获得系统服务 获得闹钟管理器
        AlarmManager alarmManager = (AlarmManager) tApplication.getSystemService(Context.ALARM_SERVICE);
        //设置闹钟管理器的set 设置睡眠2秒 再启动
        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 2000,pendingIntent);
        //调用自己类tApplication 中自己写的finish()方法 销毁进程。以便启动新的进程
        tApplication.finish();

    }

}

MyApplication 中创建finish() 方法,设置默认的捕获未捕获异常的handler

//在manifest.xml注册
public class TApplication extends Application{
    ArrayList<Activity> activityList=new ArrayList();
    public void finish()
    {
        for(Activity activity:activityList)
        {
            activity.finish();
        }
        //android.os 系统强制杀死应用程序
        Process.killProcess(Process.myPid());
    }
    //全局
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        CrashHandler crashHandler=new CrashHandler(this);
        //设置默认的捕获未捕获异常的handler 
        Thread.setDefaultUncaughtExceptionHandler(crashHandler);
    }

}

你可能感兴趣的:(质量监控,未捕获的异常)