kunyashaw博客主页 关注kunyashaw新博客 关于kunyashaw 转到底部

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

 

posted @ 2015-11-04 08:09  kunyashaw  阅读(2204)  评论(0编辑  收藏  举报
回到顶部