捕捉异常有用的方法
2015-06-05 14:17
405 查看
今天先记录一下捕捉异常有用的一个用法.
总会因为一些异常未能捕捉而跳出程序,这时如果有这个类会很有帮助,而且可以尝试把错误记录下来,写在SD卡上,以便研究.
具体用法如下:
1 先实例化用于处理未捕捉异常的类,我命名为CrashHandler
public class CrashHandler implements UncaughtExceptionHandler { //实现UncaughtExceptionHandler接口
private String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;
private CrashHandler()
{
}
public static CrashHandler getInstance() //实现单例模式
{
return INSTANCE;
}
public void init(Context context)
{
mContext = context;
//获取系统默认的UncaughtExceptionHandler
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
//设置当前CrashHandler为程序默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override //处理未接收的异常
public void uncaughtException(Thread thread, Throwable e)
{
// TODO Auto-generated method stub
if (!handleException(e) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, e);
} else {
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
//退出或重启
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
/*
Intent intent = new Intent();
intent.setClass(mContext, PhoneChainActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
*/
}
}
/**
* 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成
*
* @param ex
* @return true:如果处理了该异常信息;否则返回 false
*/
private boolean handleException(Throwable ex)
{
if (ex == null) {
return false;
}
// 使用 Toast 来显示异常信息
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
// 收集设备参数信息
collectDeviceInfo(mContext);
// 保存日志文件
saveCrashInfo2File(ex);
return true;
}
......
}
2 在你的程序中调用它
在Application类中调动,替换掉原来的处理.
public class PhoneChainApp extends Application {
@Override
public void onCreate()
{
......
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());
}
}
这样在程序遇到未处理异常时会先显示"程序要退出"信息之后再退出软件,同时会把信息保留下来,以便寻找BUG.
总会因为一些异常未能捕捉而跳出程序,这时如果有这个类会很有帮助,而且可以尝试把错误记录下来,写在SD卡上,以便研究.
具体用法如下:
1 先实例化用于处理未捕捉异常的类,我命名为CrashHandler
public class CrashHandler implements UncaughtExceptionHandler { //实现UncaughtExceptionHandler接口
private String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;
private CrashHandler()
{
}
public static CrashHandler getInstance() //实现单例模式
{
return INSTANCE;
}
public void init(Context context)
{
mContext = context;
//获取系统默认的UncaughtExceptionHandler
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
//设置当前CrashHandler为程序默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override //处理未接收的异常
public void uncaughtException(Thread thread, Throwable e)
{
// TODO Auto-generated method stub
if (!handleException(e) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, e);
} else {
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
//退出或重启
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
/*
Intent intent = new Intent();
intent.setClass(mContext, PhoneChainActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
*/
}
}
/**
* 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成
*
* @param ex
* @return true:如果处理了该异常信息;否则返回 false
*/
private boolean handleException(Throwable ex)
{
if (ex == null) {
return false;
}
// 使用 Toast 来显示异常信息
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
// 收集设备参数信息
collectDeviceInfo(mContext);
// 保存日志文件
saveCrashInfo2File(ex);
return true;
}
......
}
2 在你的程序中调用它
在Application类中调动,替换掉原来的处理.
public class PhoneChainApp extends Application {
@Override
public void onCreate()
{
......
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());
}
}
这样在程序遇到未处理异常时会先显示"程序要退出"信息之后再退出软件,同时会把信息保留下来,以便寻找BUG.
相关文章推荐
- 线性表练习题1
- CommandBehavior.CloseConnection有何作用,详细解析
- appium简明教程(4)——appium client的安装
- 48.找出字符串中出现频率最高的字母
- How to ignore SSL certificate errors in Apache HttpClient 4.4
- iOS plist文件的读写
- Linux操作系统三大应用领域
- uploadify 属性介绍
- android的消息处理机制(图文+源码分析)—Looper/Handler/Message
- xftp和xshell的使用
- 深入讲解WEBVIEW(下)
- appium简明教程(3)——appium的安装windows版
- BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster( dp )
- 用代码创建并实例化在storyboard中声明的ViewController
- 批量设置用户权限
- Android 问题解决方法(一)
- X-code使用的小技巧1
- Java字符串按照中文拼音排序
- 黑马程序员——Java 初识
- JQuery 中设置AJAX 的全局函数