美文网首页Android开发Android技术知识Android知识
Android 解决因未捕获异常而崩溃的问题

Android 解决因未捕获异常而崩溃的问题

作者: 齐小政 | 来源:发表于2016-12-19 14:56 被阅读1799次

    最近时间不是很紧张(10106还真是不太好受的,哈哈。。),有了罕见的双休,正好周六是和女票的六周年纪念日,这要是周六再加班,就真是“怪不得程序员没有女朋友了”,先放个美食图:

    将太无二.png

    三里屯的将太无二店,味道还可以,三文鱼刺身我喜欢。。


    今天要说的是在Android应用中因为没有捕获异常而导致程序崩溃的问题。

    先看张图(随便找的):

    1346653764_2901.png

    在应用运行过程中,有很多异常可能会发生,一般情况我们会自己处理异常情况,但是也不能面面俱到,而我们希望在没有被捕获的异常发生的时候尽量做到不要让程序崩溃,并且需要在第一时间保存现场,必要时将log信息上传到server,以便在后期版本中修复。

    如何处理未捕获的异常呢?
    1. 首先是定义一个类,我们取名为:CrashHandler,然后实现一个接口 java.lang.Thread.UncaughtExceptionHandler,要实现该接口里面的uncaughtException(Thread t, Throwable e)方法 ,在这个函数里面,我们可以做一些处理,例如将异常信息保存到sdcard上的某个位置,或者提示用户异常出现等等一些操作等。

    代码:

    /**
     * crash异常log捕获
     * 捕获到的log会保存到sdcard文件里
     * @author qizhenghao
     */
    public class CrashHandler implements UncaughtExceptionHandler {
        private static CrashHandler instance;
        private Context context;
        /** 系统默认的UncaughtException处理类 */
        private Thread.UncaughtExceptionHandler defaultHandler;
    
        // 单例
        public static CrashHandler getInstance() {
            if (instance == null) {
                instance = new CrashHandler();
            }
            return instance;
        }
    
        // 初始化
        public void init(Context context) {
            this.context = context;
            defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
            Thread.setDefaultUncaughtExceptionHandler(this);
        }
    
        @Override
        public void uncaughtException(Thread arg0, Throwable arg1) {
            DownloadManager.getInstance().clearNotification();
            if (!handleException(arg1) && defaultHandler != null) {
                // 如果用户没有处理则让系统默认的异常处理器来处理
                defaultHandler.uncaughtException(arg0, arg1);
            } else {
                // 退出进程
                System.exit(16);
            }
        }
    
        // 处理异常
        private boolean handleException(Throwable ex) {
            if (ex == null) {
                return true;
            }
            ex.printStackTrace();
            //保存log信息到本地文件
            Methods.logCrashOnFile(context, ex);
    
            // 等待1s
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            // 关闭进程
            int nPid = android.os.Process.myPid();
            android.os.Process.killProcess(nPid);
    
            return true;
        }
    

    其中Thread.setDefaultUncaughtExceptionHandler(this);是最关键的一行代码了。

    1. 其次,在Application的onCreate()方法中进行注册:
    public class ExcApplication extends Application {
        @Override
        public void onCreate() {
            CrashHandler.getInstance().init(getApplicationContext());
        }
    }
    
    1. 最后,这个活儿其实可以交给第三方服务来干,如:友盟。
      下面是友盟的截图:
    友盟截图.png

    具体demo还是参考友盟官方的:http://dev.umeng.com/analytics/android-doc/integration?spm=0.0.0.0.1HjVlF

    就这样啦,这个问题对于初学者还是要了解一下,一般在APP的设计之初架构师早就设计好了。但是话又说回来,说不好哪天你心血来潮自己整个线上的APP了呢?提前恭喜你吧😁

    相关文章

      网友评论

        本文标题:Android 解决因未捕获异常而崩溃的问题

        本文链接:https://www.haomeiwen.com/subject/nndtvttx.html