android應用異常退出,抓取異常信息寫入文件裏

直接上代碼,想用的同學直接創建一個類就可以用了!

/**
 * 程序異常抓包
 * 
 * @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);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章