android异常捕捉处理-CrashHandler

在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 deleteList = new ArrayList();
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)