Android-异常捕获
本文使用CrashHandler类,对APP异常进行捕获。
使用方法:在application中进行初始化。
// 异常捕获类
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());
CrashHandler类:对全局的异常进行一个捕获。并形成日志内容,保存到本地文件夹。
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.xang.mxang.MyApplication;
import android.content.Context;
import android.util.Log;
/**
* 程序崩溃时自动退出
*/
public class CrashHandler implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
// 系统默认的UncaughtException处理类
private Thread.UncaughtExceptionHandler mDefaultHandler;
// CrashHandler实例
private static CrashHandler INSTANCE;
/** 保证只有一个CrashHandler实例 */
private CrashHandler() {
}
/** 获取CrashHandler实例 ,单例模式 */
public static CrashHandler getInstance() {
if(INSTANCE == null){
INSTANCE = new CrashHandler();
}
return INSTANCE;
}
/**
* 初始化
*
* @param context
*/
public void init(Context context) {
// 获取系统默认的UncaughtException处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
// 设置该CrashHandler为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 当UncaughtException发生时会转入该函数来处理
*/
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Log.e(TAG, "error : ", e);
}
// 退出程序
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}
/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
*
* @param ex
* @return true:如果处理了该异常信息;否则返回false.
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return false;
}
saveLog(ex);
ex.printStackTrace();
// 使用Toast来显示异常信息
new Thread() {
@Override
public void run() {
MyApplication.appHandler.post(new Runnable() {
@Override
public void run() {
MyToast.showToast(MyApplication.getContextObject(),"很抱歉,程序出现异常,即将退出");
}
});
}
}.start();
return true;
}
private void saveLog(Throwable ex) {
try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
saveLog("quit:\r\n" + sw.toString() + "\r\n");
} catch (Exception e) {
e.printStackTrace();
}
}
/** log文件名称 */
private final String LOG_FILE_NAME = "错误日志.txt";
/**
* 存储日志内容
*
* @param logContent
* 日志内容
*/
public void saveLog(String logContent) {
try {
File dir = new File(MyApplication.filePath);
if (!dir.exists()) {
dir.mkdirs();
}
File f = new File(MyApplication.filePath, LOG_FILE_NAME);
FileOutputStream fos = new FileOutputStream(f, true);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
fos.write(("\n" + sdf.format(new Date())).getBytes());
fos.write((logContent + "\n\n").getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}