捕獲Android 錯誤信息然后發送至服務器
原理: 跟JavaEE的自定義異常捕獲一樣,將錯誤一直向上拋,然后在最上層統一處理。這里就可以獲得異常信息,先保存到本地,下一次運行的時候上傳到服務區. 當然這些可以由程序員自己根據實際情況具體處理,這里只是提供捕獲異常并進一步處理的一個方案. 主要用到的是自定義的CrashHandler(繼承自UncaughtExceptionHandler),具體代碼如下:
/*** @author Tian * 在Application中統一捕獲異常,保存到文件中下次再打開時上傳 */ public class CrashHandler implements UncaughtExceptionHandler { /** 是否開啟日志輸出,在Debug狀態下開啟, * 在Release狀態下關閉以提示程序性能 * */ public static final boolean DEBUG = true; /** 系統默認的UncaughtException處理類 */ private Thread.UncaughtExceptionHandler mDefaultHandler; /** CrashHandler實例 */ private static CrashHandler INSTANCE; /** 程序的Context對象 */ // private Context mContext; /** 保證只有一個CrashHandler實例 */ private CrashHandler() {} /** 獲取CrashHandler實例 ,單例模式*/ public static CrashHandler getInstance() { if (INSTANCE == null) { INSTANCE = new CrashHandler(); } return INSTANCE; } /** * 初始化,注冊Context對象, * 獲取系統默認的UncaughtException處理器, * 設置該CrashHandler為程序的默認處理器 * * @param ctx */ public void init(Context ctx) { // mContext = ctx; mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } /** * 當UncaughtException發生時會轉入該函數來處理 */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(ex) && mDefaultHandler != null) { //如果用戶沒有處理則讓系統默認的異常處理器來處理 mDefaultHandler.uncaughtException(thread, ex); } else { //如果自己處理了異常,則不會彈出錯誤對話框,則需要手動退出app try { Thread.sleep(3000); } catch (InterruptedException e) { } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); } } /** * 自定義錯誤處理,收集錯誤信息 * 發送錯誤報告等操作均在此完成. * 開發者可以根據自己的情況來自定義異常處理邏輯 * @return * true代表處理該異常,不再向上拋異常, * false代表不處理該異常(可以將該log信息存儲起來)然后交給上層(這里就到了系統的異常處理)去處理, * 簡單來說就是true不會彈出那個錯誤提示框,false就會彈出 */ private boolean handleException(final Throwable ex) { if (ex == null) { return false; } // final String msg = ex.getLocalizedMessage(); final StackTraceElement[] stack = ex.getStackTrace(); final String message = ex.getMessage(); //使用Toast來顯示異常信息 new Thread() { @Override public void run() { Looper.prepare(); // Toast.makeText(mContext, "程序出錯啦:" + message, Toast.LENGTH_LONG).show(); // 可以只創建一個文件,以后全部往里面append然后發送,這樣就會有重復的信息,個人不推薦 String fileName = "crash-" + System.currentTimeMillis() + ".log"; File file = new File(Environment.getExternalStorageDirectory(), fileName); try { FileOutputStream fos = new FileOutputStream(file,true); fos.write(message.getBytes()); for (int i = 0; i < stack.length; i++) { fos.write(stack[i].toString().getBytes()); } fos.flush(); fos.close(); } catch (Exception e) { } Looper.loop(); } }.start(); return false; } // TODO 使用HTTP Post 發送錯誤報告到服務器 這里不再做詳細描述 // private void postReport(File file) { // } } </pre>
本文由用戶 m8x2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!