62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?
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遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。
62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?的更多相关文章
- ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
		
中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...
 - 安卓开发app在后台运行时页面数据被系统清除后操作之重启APP
		
在安卓开发过程中,当点击HOME键,将app运行在后台时,然后再点击app图标进入时,遇到了如下两种情况: 1.每次打开时,app的入口页面总是被执行. 2.当运行内存被其它应用占用完时,在进入app ...
 - 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
		
毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...
 - C#中的那些全局异常捕获
		
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
 - Android全局异常捕捉
		
// 定义自定义捕捉 package com.xiaosw.test; import java.io.File; import java.io.FileOutputStream; import jav ...
 - 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录
		
缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...
 - 基于jeesite的cms系统(七):GlobalException全局异常和部署
		
关于全局异常: 在业务代码中专注处理业务,而不是返回各种CodeMsg(比如这里只需要知道登录时成功还是失败,其余情况直接抛出异常),可以直接抛出异常,添加一个全局异常类,根据CodeMsg来生成异常 ...
 - .Net下的全局异常捕获问题
		
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
 - (转)C#中的那些全局异常捕获
		
C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html) 1.WPF全局捕获异常 public partia ...
 
随机推荐
- 【MFC】0xC0000005: 读取位置 0x00000020 时发生访问冲突
			
原因:使用GetDlgItem()函数时需要先判断指针然后才可以使用. 错误代码: //重新建一个线程,查询帧同步 DWORD WINAPI SCsync_Thread(LPVOID Lparam) ...
 - 红象云腾CRH 一键部署大数据平台
			
平台: arm 类型: ARM 模板 软件包: azkaban hadoop 2.6 hbase hive kafka spark zeppelin azkaban basic software bi ...
 - Android商城开发系列(十四)——  设置监听RecyclerView的位置
			
在前面的博客中有讲到过点击一个图片按钮控制RecyclerView的滚动到顶部位置的效果,但是那个图片按钮一直处在一个显示的状态,今天我们来改造一下那个地方,我们要实现的效果是:一开始打开的时候看不到 ...
 - COGS 750. 栅格网络流
			
★★☆ 输入文件:flowa.in 输出文件:flowa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太难了,他不知道如何解决 ...
 - java核心技术 要点笔记2
			
第4章 对象和类 1.面向对象 类:构造对象的模板,创建类的实例:由类构造对象的过程,封装,继承: 对象:对象的特性——对象的行为,对象的状态,对象的标识: 类之间的关系: 依赖(“user-a” ...
 - idea字体模糊
			
用jdk1.8的jre替换idea的jre64,但是记得在lib里加上jdk的lib中的tools.jar. 如图: 然后 将原来jre64的TOOLS.jar拷贝到替换后的jre的lib目录下,重启 ...
 - systemd初始化进程(转)
			
Systemd初始化进程 Linux操作系统开机过程首先从BIOS开始→进入"Boot Loader"→加载内核→内核的初始化→启动初始化进程,初始化进程作为系统第一个进程,它需要 ...
 - 【洛谷4657】[CEOI2017] Chase(一个玄学的树形DP)
			
点此看题面 大致题意: 有一棵树,树上编号为\(i\)的节点上有\(F_i\)个铁球,逃亡者有\(V\)个磁铁,当他在某个节点放下磁铁时,与这个节点相邻的所有节点上的铁球都会被吸引到这个节点.然后一个 ...
 - 漫谈 Clustering (番外篇): Vector Quantization
			
在接下去说其他的聚类算法之前,让我们先插进来说一说一个有点跑题的东西:Vector Quantization.这项技术广泛地用在信号处理以及数据压缩等领域.事实上,在 JPEG 和 MPEG-4 等多 ...
 - Bootstrap 提示工具(Tooltip)插件的事件
			
事件 下表列出了提示工具(Tooltip)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tooltip 当调用 show 实例方法时立即触发该事件. $('#m ...