控制整个App的异常收集与处理,使用前记得要在Application中初始化initCrasHandler

CrasHandler APP异常收集类:

package common.library.exception;

import android.content.Context;
import android.os.Build;
import android.os.Looper; import common.library.config.AppConfig;
import common.library.manager.AppManager;
import common.library.utils.LogUtil; /**
* @Author Liudeli
* @Describe:控制整个App的异常收集与处理,使用前记得要在Application中初始化initCrasHandler
*/
public class CrasHandler implements Thread.UncaughtExceptionHandler { private static final String TAG = CrasHandler.class.getSimpleName();
private static final String TAG_THIS_APP_NAME = AppConfig.APP_NAME;
private static final String ERROR_INFO = "后台检测到程序异常,程序在五秒内自动关闭,请告知开发人员刘德利来解决此问题"; private Context mContext;
private Thread.UncaughtExceptionHandler uncaughtExceptionHandler; private CrasHandler() {} private static CrasHandler crasHandler = null; public static CrasHandler getInstance() {
if (null == crasHandler) {
// synchronized (CrasHandler.class) {
//if (null == crasHandler) {
crasHandler = new CrasHandler();
// }
// }
}
return crasHandler;
} /**
* 初始化设置(把系统的修改成自身的来控制)
*/
public void initCrasHandler(Context mContext) {
this.mContext = mContext;
Thread.setDefaultUncaughtExceptionHandler(this);
uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
} @Override
public void uncaughtException(Thread t, Throwable e) {
if (isHandler(e)) {
handlerException(t, e);
} else {
uncaughtExceptionHandler.uncaughtException(t, e);
}
} /**
* 判断是否为空,才能知道是否需要自己处理
* @param e
* @return
*/
private boolean isHandler(Throwable e) {
if (null == e) {
return false;
} else {
return true;
}
} /**
* 处理我需要处理的异常信息,并告知用户,并退出当前应用程序
* @param t
* @param ex
*/
private void handlerException(Thread t, Throwable ex) {
new Thread(){
@Override
public void run() {
super.run();
// 默认下,Android是没有开启Looper消息处理的,主线程除外
Looper.prepare();
LogUtil.toastL(mContext, ERROR_INFO);
Looper.loop();
}
}.start(); // 收集异常信息
collectException(ex); try {
t.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
} // 关闭APP
AppManager.getInstance().deleteAllActivity();
// 结束当前应用程序进程
android.os.Process.killProcess(android.os.Process.myPid());
// 结束虚拟机,是否所有内存
System.exit(0);
} /**
* 收集异常信息
* @param e
*/
private void collectException(Throwable e) {
final String deviceInfo = Build.VERSION.SDK_INT + ", " + Build.MODEL + ", " + Build.PRODUCT;
final String errorInfo = e.getMessage();
new Thread(){
@Override
public void run() {
super.run();
LogUtil.e(TAG_THIS_APP_NAME, "deviceInfo:" + deviceInfo + ", errorInfo:" + errorInfo);
}
}.start();
}
}

在APP项目中配置 APP的异常收集与处理;

在APP项目中的 XXXApplication --> onCreate方法中以下配置

CrasHandler.getInstance().initCrasHandler(getApplicationContext());

最新文章

  1. CAEmitterLayer 粒子发射Layer的相关属性
  2. Linux下查看所有CPU核心使用率的方法
  3. JQuery LazyLoad实现图片延迟加载-探究
  4. makefile中的shell语法
  5. delphi 基础之一 数据类型和基本语法
  6. C# 索引器 学习
  7. html代码实现自动滚动,鼠标滑过时停止滚动
  8. day11基础代码——函数指针
  9. C# Best Practices - Handling Strings
  10. 数据结构——AVL平衡树
  11. Composer常见问题
  12. Your build host version of Xamarin.IOS (release NO.)is too recent to work with the IOS designer
  13. xtemplate语法
  14. Freemarker的基本语法及入门基础
  15. UGUI 中Dropdown控件的使用经验
  16. JSP(一):初识JSP
  17. 洛谷 P3956 棋盘(BFS)
  18. 记一次ios加急上架经历
  19. JDBC Mysql 驱动连接异常
  20. iOS开发网络篇—GET请求和POST请求的说明与比较

热门文章

  1. Containerpilot 配置文件 之 Jobs
  2. 根据数组下标在MongoDB中修改数组元素
  3. ASP.NET中UrlEncode应该用Uri.EscapeDataString()(转)
  4. hdoj2859(矩阵DP)
  5. luoguP1004 方格取数(四维DP)
  6. cdoj第13th校赛初赛L - Lovely princess
  7. Tunnel Warfare (区间合并|最大值最小值巧妙方法)
  8. PostgreSQL+pgpool-II复制方案
  9. linux 下 php 安装 libevent
  10. Golang之waitgroup用法