在开发过程中经经常使用到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关闭掉。

Android开发时经经常使用的LogUtil的更多相关文章

  1. Android开发时,那些相见恨晚的工具或网站!

    本文来我在知乎话题Android开发时你遇到过什么相见恨晚的工具或网站?下的回答! 在实际Android开发过程确实会有很多相见恨晚的工具或网站出现,下面是我自己的一些分享. 1.源码网站 https ...

  2. (转载) Android开发时,那些相见恨晚的工具或网站!

    huangmindong的专栏       目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 Android ...

  3. Android开发时包名、签名、渠道和版本号的易坑点(转)

    本文中总结一下 Android 开发中容易被忽视的一些注意事项吧: 一.谨慎选择包名 包名 (Package Name) 就相当于一款应用在户口本上登记的名字,是系统用来区分不同应用的字段.重复的包名 ...

  4. 解决Mac上Android开发时adb连接不到手机问题

    今天在Mac OS上进行Android开发的时候,打开eclipse连接不到手机MX4问题 1. 插入手机打开 Terminal,输入 system_profiler  SPUSBDataType 2 ...

  5. android开发时,finish()跟System.exit(0)的区别

      这两天在弄Android,遇到一个问题:所开发的小游戏中有背景音乐,玩的过程中始终有音乐在放着,然后在我退出游戏后,音乐还在播放! 我看了一下我最开始写的退出游戏的代码,就是简单的finish() ...

  6. Android开发时提示Your project contains error(s),please fix them be

    有次在使用eclipse写好Android的代码,代码没有报错.然后 想在AVD中运行测试时,总是会弹出错误框,提示信息为:    “Your project contains error(s),pl ...

  7. 用Eclipse做Android开发时出现java.lang.NoClassDefFoundError问题

    之前有遇到过这个问题,后来解决了,今天又遇到了,但是忘了当时是怎么解决的,费了好长时间,终于又找回解决的方法,现在记录下来,以防以后又遇到. 这个错误出现在我的某一个Activity,但是我反复确认了 ...

  8. android开发时程序出现崩溃问题

    原因:项目目录下的:src与gen中的包名不一致时,出现问题 <manifest xmlns:android="http://schemas.android.com/apk/res/a ...

  9. Android 开发时使用 ViewPager 的问题及解决方案整理

    1. ViewPager 的页面重置问题 当我们使用ViewPager控件时,假设我们的ViewPager有三页,当我们第一次启动ViewPager显示第一页的时候,ViewPager会预加载第二页, ...

随机推荐

  1. 洛谷P1077 摆花(背包dp)

    P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能 ...

  2. sublime text 快键键

    sublime text 的快捷键ctrl+l                              选择整行(按住-继续选择下行)ctrl+shift+k                    ...

  3. Run as ant build每次都执行两次

    因为用了selenium+testng+ant的框架,所以每次执行自动化,我就run as ant build.发现测试每次都执行两次,很奇怪.因为也没有影响到测试结果,所以一开始也就let it g ...

  4. MatLab之HDL coder

    1 Workflow The workflow for applying HDL code generation to the hardware design process requires the ...

  5. 装X数学:高雅的数学表示

    采用高雅的数学描述 转自于:研究生之路怎么走?       高雅的数学描述会提高你论文的等级和加强评审人对你基础功底的认可.例如泛函分析.集合.测度.度量空间和拓扑空间.现代代数.微分几何等数学方面的 ...

  6. jQuery+pjax简单示例汇总

    pjax 是一个jQuery插件,它使用 ajax 和 pushState 来实现快速的浏览体验,包括真正的固定链接,页面标题和工作返回按钮. ajax缺点是破坏了浏览器的前进后退,因为ajax的请求 ...

  7. html 报告页面样式

    修改了下HTML页面样式 页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  8. appium+python,app自动化测试框架

    目前正在写一个app的自动化UI测试框架,目录结构如, 脚本还在调试,实现的方法是从excel表格读取测试用例,执行完成后会将结果保存到Excel中. 等待.......

  9. SSL/TLS 加密新纪元 - Let's Encrypt

    转自: https://linux.cn/article-6565-1.html SSL/TLS 加密新纪元 - Let's Encrypt 根据 Let's Encrypt 官方博客消息,Let's ...

  10. dup、文件锁、库函数、函数调用(day07)

    一.lseek()重新定位文件的读写位置. #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off ...