您好,登錄后才能下訂單哦!
Android中怎么捕獲錯誤信息,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
異常捕獲類如下:
/** * @author Stay * 在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) { // 在上傳的時候還可以將該app的version,該手機的機型等信息一并發送的服務器, // Android的兼容性眾所周知,所以可能錯誤不是每個手機都會報錯,還是有針對性的去debug比較好 // } }
在Application onCreate時就注冊ExceptionHandler,此后只要程序在拋異常后就能捕獲到。
public class Appextends Application{ @Override public void onCreate() { super.onCreate(); CrashHandler crashHandler = CrashHandler.getInstance(); //注冊crashHandler crashHandler.init(getApplicationContext()); } }
public class LogActivityextends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try {//制造bug File file =new File(Environment.getExternalStorageState() ,"crash.bin"); FileInputStream fis =new FileInputStream(file); byte[] buffer =new byte[1024]; fis.read(buffer); }catch (Exception e) { //這里不能再向上拋異常,如果想要將log信息保存起來,則拋出runtime異常, // 讓自定義的handler來捕獲,統一將文件保存起來上傳 throw new RuntimeException(e); } } }
注意,如果catch后不throw就默認是自己處理了,ExceptionHandler不會捕獲異常了。
再分享一個Log的封裝類,只要在這里設置DEBUG的值就能讓控制臺是否打印出log。
public class DebugUtil { public static final String TAG ="ICON"; public static final boolean DEBUG =true; public static void toast(Context context,String content){ Toast.makeText(context, content, Toast.LENGTH_SHORT).show(); } public static void debug(String tag,String msg){ if (DEBUG) { Log.d(tag, msg); } } public static void debug(String msg){ if (DEBUG) { Log.d(TAG, msg); } } public static void error(String tag,String error){ Log.e(tag, error); } public static void error(String error){ Log.e(TAG, error); } }
關于Android中怎么捕獲錯誤信息問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。