62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?
2024-08-28 21:31:24
1、创建一个类为CrashHandler
import android.content.Context;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast; import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale; /**
* author: Created by zzl on 15/11/3.
*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = CrashHandler.class.getSimpleName(); private static CrashHandler instance; // 单例模式 private Context context; // 程序Context对象
private Thread.UncaughtExceptionHandler defalutHandler; // 系统默认的UncaughtException处理类
private DateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA); private CrashHandler() { } /**
* 获取CrashHandler实例
*
* @return CrashHandler
*/
public static CrashHandler getInstance() {
if (instance == null) {
synchronized (CrashHandler.class) {
if (instance == null) {
instance = new CrashHandler();
}
}
} return instance;
} /**
* 异常处理初始化
*
* @param context
*/
public void init(Context context) {
this.context = context;
// 获取系统默认的UncaughtException处理器
defalutHandler = Thread.getDefaultUncaughtExceptionHandler();
// 设置该CrashHandler为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
} /**
* 当UncaughtException发生时会转入该函数来处理
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) { // 自定义错误处理
boolean res = handleException(ex);
if (!res && defalutHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
defalutHandler.uncaughtException(thread, ex); } else {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Log.e(TAG, "error : ", e);
}
// 退出程序
//android.os.Process.killProcess(android.os.Process.myPid());
//System.exit(1);
}
} /**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
*
* @param ex
* @return true:如果处理了该异常信息;否则返回false.
*/
private boolean handleException(final Throwable ex) {
if (ex == null) {
return false;
} new Thread() { @Override
public void run() {
Looper.prepare(); ex.printStackTrace();
String err = "[" + ex.getMessage() + "]";
Toast.makeText(context, "程序出现异常." + err, Toast.LENGTH_LONG)
.show(); Looper.loop();
} }.start(); // 收集设备参数信息 \日志信息
return true; }
}
2、在Application的onCreate()里实例化改crashHandler
@Override
public void onCreate() {
super.onCreate();
initInformData();
mContext = getApplicationContext();
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(mContext); }
这样当APP遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。
最新文章
- HTML 字符实体 &;lt; &;gt: &;amp;等
- Python标准模块--linecache
- espcms特殊标签
- 从jquery里的$.ajax()到angularjs的$http
- jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据
- PHP文件操作 读取与写入
- CaronteFX插件简介
- mysql 大数据量求平均值
- 最长非降/下降子序列问题(DP)(待续...)
- Debian8 加载NTFS 磁盘出错 解决方法
- Java中的那些名词术语(不断更新中)
- Contest - 第10届“新秀杯”ACM程序设计大赛网络预选赛 赛后信息(晋级名单)
- 关于WHERE后面不能放聚合函数(如SUM(...))的解决办法
- css 背景图片自适应
- Ubuntu 16.04 安装Google 浏览器
- docker中的镜像中运行Django项目
- vue父组件如何调用子组件的属性或方法
- linux内核中宏container_of是干什么的?
- centos7.0之vsftpd随笔
- 5 Steps to Getting Started with SharePoint Development
热门文章
- 2013 QConf上海软件开发大会总结
- 爱加密so保护简单脱壳测试
- 开发Maven插件
- Android商城开发系列(十一)—— 首页秒杀布局实现
- C#,什么是Attribute?什么特性?怎么被调用?
- UVA 11040 Add bricks in the wall(线性组合)
- 【wiki】红帽linux
- CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第三节
- 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素
- 第十五篇、OC_同一个View实现两个手势响应