zoukankan      html  css  js  c++  java
  • 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遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。

  • 相关阅读:
    SAP PI 如何实现消息定义查询
    EWM与ERP交互程序
    ITS Mobile Template interpretation failed. Template does not exist
    SAP Material Flow System (MFS) 物料流系统简介
    SAP EWM Table list
    EWM RF 屏幕增强
    SAP EWM TCODE list
    SAP扩展仓库管理(SAPEWM)在线研讨会笔记
    ERP与EWM集成配置ERP端组织架构(二)
    EWM RF(Radio Frequency)简介
  • 原文地址:https://www.cnblogs.com/kunyashaw/p/4934952.html
Copyright © 2011-2022 走看看