使用UncaughtExceptionHandler捕获错误日志,客户端不会崩溃。
2016-04-28 16:29
513 查看
Java 的异常处理机制中:分为Exception异常和RuntimeException异常,前者必须使用try..catch..来处理,基本上就是System.out.println(e.toString());做一下简单的处理。而RuntimeException异常则是不必须进行try..catch..处理的。现在想在RuntimeException异常时,也进行一些友好的处理,这时就用到了UncaughtExceptionHandler。
/**
* @description 用于捕获错误日志,RELEASE设置为true之后,客户端不会崩溃
*/
public class MyCrashHandler implements UncaughtExceptionHandler {
public static final String TAG = MyCrashHandler.class.getSimpleName();
private static MyCrashHandler crashHandler = new MyCrashHandler();
// TODO 设为false就不会捕获全局异常
public static final boolean RELEASE = true;
private Context mContext;
private UncaughtExceptionHandler mDefaultHandler;
private MyCrashHandler() {
}
public static MyCrashHandler getCrashHandlerInstances() {
return crashHandler;
}
public void init(Context ctx) {
mContext = ctx;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
// Sleep一会后结束程序
// 来让线程停止一会是为了显示Toast信息给用户,然后Kill程序
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
}
}
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
final String msg = "程序因未知的原因发生崩溃了,3秒后即将退出";
new Thread() {
@Override
public void run() {
// Toast 显示需要出现在一个线程的消息队列中
Looper.prepare();
Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
// 保存错误报告文件
saveCrashInfoToFile(ex);
// 发送错误报告到服务器
sendCrashReportsToServer();
return true;
}
private void saveCrashInfoToFile(Throwable ex) {
}
private void sendCrashReportsToServer() {
}
}
/**
* @description 用于捕获错误日志,RELEASE设置为true之后,客户端不会崩溃
*/
public class MyCrashHandler implements UncaughtExceptionHandler {
public static final String TAG = MyCrashHandler.class.getSimpleName();
private static MyCrashHandler crashHandler = new MyCrashHandler();
// TODO 设为false就不会捕获全局异常
public static final boolean RELEASE = true;
private Context mContext;
private UncaughtExceptionHandler mDefaultHandler;
private MyCrashHandler() {
}
public static MyCrashHandler getCrashHandlerInstances() {
return crashHandler;
}
public void init(Context ctx) {
mContext = ctx;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
// Sleep一会后结束程序
// 来让线程停止一会是为了显示Toast信息给用户,然后Kill程序
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
}
}
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
final String msg = "程序因未知的原因发生崩溃了,3秒后即将退出";
new Thread() {
@Override
public void run() {
// Toast 显示需要出现在一个线程的消息队列中
Looper.prepare();
Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
// 保存错误报告文件
saveCrashInfoToFile(ex);
// 发送错误报告到服务器
sendCrashReportsToServer();
return true;
}
private void saveCrashInfoToFile(Throwable ex) {
}
private void sendCrashReportsToServer() {
}
}
相关文章推荐
- 记录一次linux线上服务器被黑事件
- 记录一次linux线上服务器被黑事件 推荐
- CodeForces 669C
- CSS+DIV入门
- 遇到"不能执行已释放的 Script 的代码" 的问题和解决方法
- Android消息机制:Looper,MessageQueue,Message与handler
- Java下兼容linux和windows文件路径的间隔符的写法
- maven安装错误履历
- springmvc+redis项目搭建
- RCNN学习笔记(9):OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
- 关于webView
- swift - 为类和结构体增加下标(subscript)操作
- JAVA集合框架之List、Map、Set之间的选择~小案例分析
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 图像显著性论文(四)--(六)
- 常用人脸库
- GreenDao框架使用教程
- java 实现Excel数据导入数据库
- oracle添加字段 与 db2 添加字段
- 那些需要留心的非流量数据,读懂它才是关键