Android開發時經常用的LogUtil,android開發logutil
在開發過程中經常用到Log,我們常寫的一種方式就是自訂一個LogUtil工具類
private static boolean LOGV = true; private static boolean LOGD = true; private static boolean LOGI = true; private static boolean LOGW = true; private static boolean LOGE = true; public static void v(String tag, String mess) { if (LOGV) { Log.v(tag, mess); } } public static void d(String tag, String mess) { if (LOGD) { Log.d(tag, mess); } } public static void i(String tag, String mess) { if (LOGI) { Log.i(tag, mess); } } public static void w(String tag, String mess) { if (LOGW) { Log.w(tag, mess); } } public static void e(String tag, String mess) { if (LOGE) { Log.e(tag, mess); } }
這樣的工具類可以將log分類,在發布應用時選擇性關閉log,比較方便。
但問題是,跟直接使用Log類似,需要定義一個TAG,常用的辦法是在每個需要打log的類定義一個靜態字串常量TAG,賦值為類名。如果,在重構時忘記修改TAG,這樣在查看log時就可能會迷糊。當然,也有很多人會圖方便,直接用System.out.println(str);輸出。
前兩天看VolleyLog時,學習到一種新的方法,
private static String getTag() { StackTraceElement[] trace = new Throwable().fillInStackTrace() .getStackTrace(); String callingClass = ""; for (int i = 2; i < trace.length; i++) { Class<?> clazz = trace[i].getClass(); if (!clazz.equals(LogUtil.class)) { callingClass = trace[i].getClassName(); callingClass = callingClass.substring(callingClass .lastIndexOf('.') + 1); break; } } return callingClass; }
這個方法可以直接擷取到調用者的類名。使用如下:
public static void v(String mess) { if (LOGV) { Log.v(getTag(), mess); } } public static void d(String mess) { if (LOGD) { Log.d(getTag(), mess); } } public static void i(String mess) { if (LOGI) { Log.i(getTag(), mess); } } public static void w(String mess) { if (LOGW) { Log.w(getTag(), mess); } } public static void e(String mess) { if (LOGE) { Log.e(getTag(), mess); } }
如此就不需要再在類中定義TAG了。
在偵錯工具時,我們會經常列印一些資訊,包括方法名/行號之類的,下面一個方法就可以省去這些麻煩:
private static String buildMessage(String msg) { StackTraceElement[] trace = new Throwable().fillInStackTrace() .getStackTrace(); String caller = ""; for (int i = 2; i < trace.length; i++) { Class<?> clazz = trace[i].getClass(); if (!clazz.equals(LogUtil.class)) { caller = trace[i].getMethodName(); break; } } return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread() .getId(), caller, msg); }
使用方法如下:
public static void v(String mess) { if (LOGV) { Log.v(getTag(), buildMessage(mess)); } } public static void d(String mess) { if (LOGD) { Log.d(getTag(), buildMessage(mess)); } } public static void i(String mess) { if (LOGI) { Log.i(getTag(), buildMessage(mess)); } } public static void w(String mess) { if (LOGW) { Log.w(getTag(), buildMessage(mess)); } } public static void e(String mess) { if (LOGE) { Log.e(getTag(), buildMessage(mess)); } }
這樣每次列印log的時候就很方便了,直接鍵入:LogUtil.v(msg);
不需要管TAG,方法名,還有線程ID等等資訊
再一步最佳化就是格式化msg的內容
buildMessage(String format, Object... args)
最後說明一下,如果大量log這樣打會影響程式的效能,所以這樣的方法只是方便在調試時使用,在發布時,可以把調試的log關閉掉。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。