Android开发时经常用的LogUtil

在开发过程中经常用到Log,我们常写的一种方式就是自定义一个LogUtil工具类

LOGV = true;LOGD = true;LOGI = true;LOGW = true;LOGE = true;(String tag, String mess) {if (LOGV) { Log.v(tag, mess); }}(String tag, String mess) {if (LOGD) { Log.d(tag, mess); }}(String tag, String mess) {if (LOGI) { Log.i(tag, mess); }}(String tag, String mess) {if (LOGW) { Log.w(tag, mess); }}(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;}

这个方法可以直接获取到调用者的类名。使用如下:

(String mess) {if (LOGV) { Log.v(getTag(), mess); }}(String mess) {if (LOGD) { Log.d(getTag(), mess); }}(String mess) {if (LOGI) { Log.i(getTag(), mess); }}(String mess) {if (LOGW) { Log.w(getTag(), mess); }}(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);}

使用方法如下:

(String mess) {if (LOGV) { Log.v(getTag(), buildMessage(mess)); }}(String mess) {if (LOGD) { Log.d(getTag(), buildMessage(mess)); }}(String mess) {if (LOGI) { Log.i(getTag(), buildMessage(mess)); }}(String mess) {if (LOGW) { Log.w(getTag(), buildMessage(mess)); }}(String mess) {if (LOGE) { Log.e(getTag(), buildMessage(mess)); }}

这样每次打印log的时候就很方便了,,直接键入:LogUtil.v(msg); 不需要管TAG,方法名,还有线程ID等等信息

再一步优化就是格式化msg的内容

buildMessage(String format, Object… args)

最后说明一下,如果大量log这样打会影响程序的性能,所以这样的方法只是方便在调试时使用,在发布时,可以把调试的log关闭掉。

我们大都接受的是正面的教育,

Android开发时经常用的LogUtil

相关文章:

你感兴趣的文章:

标签云: