从2013年因工作需要,开始对Android做研究,期间遇到过很多问题,但都没有及时作笔记.从今天起作个笔记,留做备用.
今天先记录一下捕捉异常有用的一个用法.
刚开始写程序,总会因为一些异常未能捕捉而跳出程序,这时如果有这个类会很有帮助,而且可以尝试把错误记录下来,写在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.
阅读(2082) | 评论(0) | 转发(0) |