• 62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?


    1、创建一个类为CrashHandler

      1 import android.content.Context;
      2 import android.os.Looper;
      3 import android.util.Log;
      4 import android.widget.Toast;
      5 
      6 import java.text.DateFormat;
      7 import java.text.SimpleDateFormat;
      8 import java.util.Locale;
      9 
     10 /**
     11  * author: Created by zzl on 15/11/3.
     12  */
     13 public class CrashHandler implements Thread.UncaughtExceptionHandler {
     14     private static final String TAG = CrashHandler.class.getSimpleName();
     15 
     16     private static CrashHandler instance; // 单例模式
     17 
     18     private Context context; // 程序Context对象
     19     private Thread.UncaughtExceptionHandler defalutHandler; // 系统默认的UncaughtException处理类
     20     private DateFormat formatter = new SimpleDateFormat(
     21             "yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA);
     22 
     23     private CrashHandler() {
     24 
     25     }
     26 
     27     /**
     28      * 获取CrashHandler实例
     29      *
     30      * @return CrashHandler
     31      */
     32     public static CrashHandler getInstance() {
     33         if (instance == null) {
     34             synchronized (CrashHandler.class) {
     35                 if (instance == null) {
     36                     instance = new CrashHandler();
     37                 }
     38             }
     39         }
     40 
     41         return instance;
     42     }
     43 
     44     /**
     45      * 异常处理初始化
     46      *
     47      * @param context
     48      */
     49     public void init(Context context) {
     50         this.context = context;
     51         // 获取系统默认的UncaughtException处理器
     52         defalutHandler = Thread.getDefaultUncaughtExceptionHandler();
     53         // 设置该CrashHandler为程序的默认处理器
     54         Thread.setDefaultUncaughtExceptionHandler(this);
     55     }
     56 
     57     /**
     58      * 当UncaughtException发生时会转入该函数来处理
     59      */
     60     @Override
     61     public void uncaughtException(Thread thread, Throwable ex) {
     62 
     63         // 自定义错误处理
     64         boolean res = handleException(ex);
     65         if (!res && defalutHandler != null) {
     66             // 如果用户没有处理则让系统默认的异常处理器来处理
     67             defalutHandler.uncaughtException(thread, ex);
     68 
     69         } else {
     70             try {
     71                 Thread.sleep(3000);
     72             } catch (InterruptedException e) {
     73                 Log.e(TAG, "error : ", e);
     74             }
     75             // 退出程序
     76             //android.os.Process.killProcess(android.os.Process.myPid());
     77             //System.exit(1);
     78         }
     79     }
     80 
     81     /**
     82      * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     83      *
     84      * @param ex
     85      * @return true:如果处理了该异常信息;否则返回false.
     86      */
     87     private boolean handleException(final Throwable ex) {
     88         if (ex == null) {
     89             return false;
     90         }
     91 
     92         new Thread() {
     93 
     94             @Override
     95             public void run() {
     96                 Looper.prepare();
     97 
     98                 ex.printStackTrace();
     99                 String err = "[" + ex.getMessage() + "]";
    100                 Toast.makeText(context, "程序出现异常." + err, Toast.LENGTH_LONG)
    101                         .show();
    102 
    103                 Looper.loop();
    104             }
    105 
    106         }.start();
    107 
    108         // 收集设备参数信息 日志信息
    109         return true;                                                                                                                }
    110 }

    2、在Application的onCreate()里实例化改crashHandler

    1     @Override
    2     public void onCreate() {
    3         super.onCreate();
    4         initInformData();
    5         mContext = getApplicationContext();
    6         CrashHandler crashHandler = CrashHandler.getInstance();
    7         crashHandler.init(mContext);
    8 
    9     }

    这样当APP遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。

  • 相关阅读:
    终端不显示 git branch 名字
    多线程下bufferedwriter若不关闭并不能记下所有log
    anaconda prompt execute jupyter notebook, can't open notebook
    conda 创建新环境下载包失败
    failed to install jupyter_contrib_nbextensions
    failed to install nb_conda
    Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法
    SSL/TLS协议信息泄露漏洞(CVE-2016-2183)解决办法
    记录win NFS公网映射开放端口
    出题器
  • 原文地址:https://www.cnblogs.com/kunyashaw/p/4934952.html
Copyright © 2020-2023  润新知