直接上代碼,想用的同學直接創建一個類就可以用了!
/**
* 程序異常抓包
*
* @author MarsKang
*
*/
public class CrashHandler implements UncaughtExceptionHandler {
public static final 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 ctx) {
mContext = ctx;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(final Thread thread, final Throwable ex) {
// TODO Auto-generated method stub
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用戶沒有處理則讓系統默認的異常處理器來處理
mDefaultHandler.uncaughtException(thread, ex);
} else { // 如果自己處理了異常,則不會彈出錯誤對話框,則需要手動退出app
new Thread() {
@Override
public void run() {
Looper.prepare();
new AlertDialog.Builder(mContext).setTitle("提示")
.setCancelable(false).setMessage("程序崩潰了...")
.setNeutralButton("我知道了", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
mDefaultHandler.uncaughtException(thread, ex);
}
}).create().show();
Looper.loop();
}
}.start();
}
}
/**
* 自定義錯誤處理
*/
private boolean handleException(final Throwable ex) {
if (ex == null) {
return true;
}
Util.e(TAG, "異常退出,錯誤信息已存入SDCARD");
new Thread() {
@Override
public void run() {
String fileName = "Crash_" + Util.getCurrentDate("yyyy_MM_dd_HH_mm_ss") + ".log"; //這裏創建文件名
File file = new File(Environment.getExternalStorageDirectory(),
fileName);
try {
FileOutputStream fos = new FileOutputStream(file, true);
fos.write(formatStackTrace(ex).getBytes());
fos.flush();
fos.close();
} catch (Exception e) {
}
}
}.start();
return true;
}
/***
* 格式化堆棧信息
*/
public String formatStackTrace(Throwable throwable) {
if(throwable==null) return "";
String rtn = throwable.getStackTrace().toString();
try {
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
throwable.printStackTrace(printWriter);
printWriter.flush();
writer.flush();
rtn = writer.toString();
printWriter.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception ex) {
}
return rtn;
}
}
在主activity,onCreate()裏註冊捕獲異常
//初始化異常捕獲
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this);