android异常捕捉处理-CrashHandler
来源:互联网 发布:同步卫星轨道半径算法 编辑:程序博客网 时间:2024/05/21 10:39
在android开发过程中,我们经常会遇到Crash的问题,即使已经上线的版本也可能出现此类问题,引起的原因可能仅仅是一个判断的情况未考虑进去而引起NullPointException。而用户或是公司内部人员遇到此类问题,仅仅只告诉你是Crash,比较认真的用户就会告诉你在哪里,如何操作引起Crash, 大部分用户根本不会理会你这些。所以,我们需要一个错误报告收集。也需要对相应的异常进行处理,因此进入今天的主题----CrashHandler.
当然,如果您用的是友盟或是其他第三方的工具,也是可以进行异常报告的反馈。(PS:据我所知,友盟对于异常,也仅仅是收集错误报告,其他的还是要自己处理的)
好了,直接上代码。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.Process;
/**
* Crash
* 异常拦截器
* create by Zhiqiang_H 2016-03-23
*/
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance;
private Context context;
private String errorLogDir = null;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
private final int expirationDate = 7;//设置过期时间(单位:天)
private CrashHandler(){
}
public synchronized static CrashHandler getInstance(){
if(instance == null){
instance = new CrashHandler();
}
return instance;
}
public void init(Context context, String errorLogDir){
this.context = context;
this.errorLogDir = errorLogDir;
Thread.setDefaultUncaughtExceptionHandler(this);
//删除过期文件
new Thread(new Runnable() {
@Override
public void run() {
deleteExpirationFile();
}
}).start();
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if(ex != null) {
disposeThrowable(ex);
ex.printStackTrace();
}
}
private void disposeThrowable(Throwable ex){
StringBuffer sb = new StringBuffer();
sb.append(ex.toString()+"\n");
StackTraceElement[] steArray = ex.getStackTrace();
for(StackTraceElement ste : steArray){
sb.append("System.err at " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")\n");
}
if(errorLogDir != null){
try {
File file = new File(errorLogDir + "error_" + sdf.format(System.currentTimeMillis()) + ".txt");
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(sb.toString().getBytes("utf-8"));
fos.flush();
fos.close();
fos = null;
}catch (FileNotFoundException e){
}catch (IOException e){
}
}
android.os.Process.killProcess(Process.myPid());
System.exit(10);
}
private void deleteExpirationFile(){
if(errorLogDir == null){
return;
}
long expirationTime = expirationDate * 24 * 3600 * 1000;
long nowTime = System.currentTimeMillis();
List<File> deleteList = new ArrayList<File>();
File dir = new File(errorLogDir);
if(dir.isDirectory()){
File[] files = dir.listFiles();
for(File f : files){
if(f.exists()){
long time = f.lastModified();
if(nowTime - time >= expirationTime){
deleteList.add(f);
}
}
}
for(File f : deleteList){
f.delete();
}
}
}
}
- android异常捕捉处理-CrashHandler
- Android中CrashHandler默认异常处理机制
- CrashHandler 异常事件处理
- Android之异常处理:CrashHandler–异常处理
- android 程序异常捕捉处理
- 自定义CrashHandler 处理Uncaught异常
- android捕获全局异常,CrashHandler
- android捕获全局异常,CrashHandler
- Android全局异常捕获CrashHandler
- android捕获全局异常,CrashHandler
- Android全局异常捕获CrashHandler
- 学习和使用程序捕捉异常 CrashHandler以及ACRA
- android开发之程序异常捕捉处理
- Android崩溃日志手动捕捉工具类 CrashHandler
- 手写CrashHandler实现UncaughtExceptionHandler拦截android异常
- 手写CrashHandler实现UncaughtExceptionHandler拦截android异常
- Android 全局异常捕获之CrashHandler
- CrashHandler实现UncaughtExceptionHandler拦截android异常
- android 使用static 变量注意事项
- Qt中使用SQLITE时如何获取一个数据库中的表名QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); db.setHostName("ac
- english1
- eclipse打开报错:Java was started but returned exit code=13
- _T("")的由来及意义
- android异常捕捉处理-CrashHandler
- 在Nginx服务器中设置多个站点
- CS224D Lecture Note 1 笔记
- java日期处理函数
- hibernate一对一映射关系级联删除
- Zend Studio / Ecliplse插件EasyExplorer,打开资源文件所在的文件夹
- 将十六进制字符串转换成十进制数字
- 使用iperf测试网络性能
- MongoDB基本命令用