设为首页 加入收藏

TOP

Android程序Crash时的异常上报(一)
2014-11-24 01:45:48 来源: 作者: 【 】 浏览:3
Tags:Android 程序 Crash 时的 异常 上报

前言


--------------------------------------分割线--------------------------------------


想下载 Android程序Crash时的异常上报 DEMO的可以到Linux公社资源下载


具体下载目录在 /2013年资料/12月/14日/Android程序Crash时的异常上报


--------------------------------------分割线--------------------------------------


是否真的这样呢,其实android中有处理这类问题的方法,请看下面Thread类中的一个方法#setDefaultUncaughtExceptionHandler


/**
* Sets the default uncaught exception handler. This handler is invoked in
* case any Thread dies due to an unhandled exception.
*
* @param handler
* The handler to set or null.
*/
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {
Thread.defaultUncaughtHandler = handler;
}


从方法的字面意义来看,这个方法好像是可以设置系统的默认异常处理器,其实,这个方法就可以解决应用常见的crash问题。当crash发生的时候,我们可以捕获到异常信息,把异常信息存储到SD卡中,然后在合适的时机通过网络将crash信息上传到服务器上,这样开发人员就可以分析用户crash的场景从而在后面的版本中修复此类crash。我们还可以在crash发生时,弹出一个通知告诉用户程序crash了,然后再退出,这样做比闪退要温和一点。


步骤


1. 建立异常处理Handler


新建一个类,比如叫CrashHandler.java,代码如下,代码我就不做解释了,注释相当清晰了


public class CrashHandler implements UncaughtExceptionHandler {
private static final String TAG = "CrashHandler";
private static final boolean DEBUG = true;


private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/ryg_test/log/";
private static final String FILE_NAME = "crash";


//log文件的后缀名
private static final String FILE_NAME_SUFFIX = ".trace";


private static CrashHandler sInstance = new CrashHandler();


//系统默认的异常处理(默认情况下,系统会终止当前的异常程序)
private UncaughtExceptionHandler mDefaultCrashHandler;


private Context mContext;


//构造方法私有,防止外部构造多个实例,即采用单例模式
private CrashHandler() {
}


public static CrashHandler getInstance() {
return sInstance;
}


//这里主要完成初始化工作
public void init(Context context) {
//获取系统默认的异常处理器
mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
//将当前实例设为系统默认的异常处理器
Thread.setDefaultUncaughtExceptionHandler(this);
//获取Context,方便内部使用
mContext = context.getApplicationContext();
}


/**
* 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
* thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
try {
//导出异常信息到SD卡中
dumpExceptionToSDCard(ex);
//这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug
uploadExceptionToServer();
} catch (IOException e) {
e.printStackTrace();
}


//打印出当前调用栈信息
ex.printStackTrace();


//如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己
if (mDefaultCrashHandler != null) {
mDefaultCrashHandler.uncaughtException(thread, ex);
} else {
Process.killProcess(Process.myPid());
}


}


private void dumpExceptionToSDCard(Throwable ex) throws IOException {
//如果SD卡不存在或无法使用,则无法把异常信息写入SD卡
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (DEBUG) {
Log.w(TAG, "sdcard unmounted,skip dump exception");
return;
}
}


File dir = new File(PATH);
if (!dir.exists()) {
dir.mkdirs();
}
long current = System.currentTimeMillis();
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
//以当前时间创建log文件
File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);


try {

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇iOS在其他视图控制器中转换根视图.. 下一篇Android中显示AlertDialog对话框

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: