zoukankan      html  css  js  c++  java
  • 如何捕捉客户端异常崩溃提高用户体验

    需求:当我们的应用异常崩溃之后,我们如何的了解和如何让用户主动反馈异常报告
    1,第一步,构建一个自己的异常类,并实现下面的方法

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    public class AppException extends Exception implements UncaughtExceptionHandler {
            private Thread.UncaughtExceptionHandler mDefaultHandler;
        private AppException() {
            this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        }
    
        /**
         * 获取APP异常崩溃处理对象
         * 
         * @param context
         * @return
         */
        public static AppException getAppExceptionHandler() {
            return new AppException();
        }
    
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
    
            if (!handleException(ex) && mDefaultHandler != null) {
                mDefaultHandler.uncaughtException(thread, ex);
            }
    
        }
    
        /**
         * 自定义异常处理:收集错误信息&发送错误报告
         * 
         * @param ex
         * @return true:处理了该异常信息;否则返回false
         */
        private boolean handleException(Throwable ex) {
            if (ex == null) {
                return false;
            }
    
            final Context context = AppManager.getAppManager().currentActivity();
    
            if (context == null) {
                return false;
            }
    
            final String crashReport = getCrashReport(context, ex);
            // 显示异常信息&发送报告
            new Thread() {
                public void run() {
                    Looper.prepare();
                    UIHelper.sendAppCrashReport(context, crashReport);
                    Looper.loop();
                }
    
            }.start();
            return true;
        }
    
        /**
         * 获取APP崩溃异常报告
         * 
         * @param ex
         * @return
         */
        private String getCrashReport(Context context, Throwable ex) {
            PackageInfo pinfo = ((AppContext) context.getApplicationContext())
                    .getPackageInfo();
            StringBuffer exceptionStr = new StringBuffer();
            exceptionStr.append("Version: " + pinfo.versionName + "("
                    + pinfo.versionCode + ")n");
            exceptionStr.append("Android: " + android.os.Build.VERSION.RELEASE
                    + "(" + android.os.Build.MODEL + ")n");
            exceptionStr.append("Exception: " + ex.getMessage() + "n");
            StackTraceElement[] elements = ex.getStackTrace();
            for (int i = 0; i < elements.length; i++) {
                exceptionStr.append(elements[i].toString() + "n");
            }
            return exceptionStr.toString();
        }
    
    }
    

    2.第二步 与用户交互的界面

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /**
         * 发送App异常崩溃报告
         * @param cont
         * @param crashReport
         */
        public static void sendAppCrashReport(final Context cont, final String crashReport)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(cont);
            builder.setIcon(android.R.drawable.ic_dialog_info);
            builder.setTitle(R.string.app_error);
            builder.setMessage(R.string.app_error_message);
            builder.setPositiveButton(R.string.submit_report, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    //发送异常报告
                    Intent i = new Intent(Intent.ACTION_SEND);
                    //i.setType("text/plain"); //模拟器
                    i.setType("message/rfc822") ; //真机
                    i.putExtra(Intent.EXTRA_EMAIL, new String[]{"你的邮箱"});
                    i.putExtra(Intent.EXTRA_SUBJECT,"Android客户端 - 错误报告");
                    i.putExtra(Intent.EXTRA_TEXT,crashReport);
                    cont.startActivity(Intent.createChooser(i, "发送错误报告"));
                    //退出
    
                }
            });
            builder.setNegativeButton(R.string.sure, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    //退出
    
                }
            });
            builder.show();
        }
    

    3.第三部 最重要的一步
    自己实现一个 Application 在onCreate() 中添加下面的方法

    1
    2
     //注册App异常崩溃处理器
            Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler());
    
    路漫漫其修远兮 吾将上下而求索
  • 相关阅读:
    植物大战僵尸游戏内存地址
    Win7如何取消用户登陆界面
    Adobe PS CS6安装详解
    MVC 支持同名路由,不同命名空间
    Session阻塞 读写锁引发的小问题
    GZipStream 压缩和解压
    IIS 工作原理之非托管代码旅程(一)
    Http协议(一)
    Css学习笔记 (一)
    Linq二 LinqToSql
  • 原文地址:https://www.cnblogs.com/hudabing/p/3184100.html
Copyright © 2011-2022 走看看