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关闭掉。
Android开发时经经常使用的LogUtil的更多相关文章
- Android开发时,那些相见恨晚的工具或网站!
本文来我在知乎话题Android开发时你遇到过什么相见恨晚的工具或网站?下的回答! 在实际Android开发过程确实会有很多相见恨晚的工具或网站出现,下面是我自己的一些分享. 1.源码网站 https ...
- (转载) Android开发时,那些相见恨晚的工具或网站!
huangmindong的专栏 目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 Android ...
- Android开发时包名、签名、渠道和版本号的易坑点(转)
本文中总结一下 Android 开发中容易被忽视的一些注意事项吧: 一.谨慎选择包名 包名 (Package Name) 就相当于一款应用在户口本上登记的名字,是系统用来区分不同应用的字段.重复的包名 ...
- 解决Mac上Android开发时adb连接不到手机问题
今天在Mac OS上进行Android开发的时候,打开eclipse连接不到手机MX4问题 1. 插入手机打开 Terminal,输入 system_profiler SPUSBDataType 2 ...
- android开发时,finish()跟System.exit(0)的区别
这两天在弄Android,遇到一个问题:所开发的小游戏中有背景音乐,玩的过程中始终有音乐在放着,然后在我退出游戏后,音乐还在播放! 我看了一下我最开始写的退出游戏的代码,就是简单的finish() ...
- Android开发时提示Your project contains error(s),please fix them be
有次在使用eclipse写好Android的代码,代码没有报错.然后 想在AVD中运行测试时,总是会弹出错误框,提示信息为: “Your project contains error(s),pl ...
- 用Eclipse做Android开发时出现java.lang.NoClassDefFoundError问题
之前有遇到过这个问题,后来解决了,今天又遇到了,但是忘了当时是怎么解决的,费了好长时间,终于又找回解决的方法,现在记录下来,以防以后又遇到. 这个错误出现在我的某一个Activity,但是我反复确认了 ...
- android开发时程序出现崩溃问题
原因:项目目录下的:src与gen中的包名不一致时,出现问题 <manifest xmlns:android="http://schemas.android.com/apk/res/a ...
- Android 开发时使用 ViewPager 的问题及解决方案整理
1. ViewPager 的页面重置问题 当我们使用ViewPager控件时,假设我们的ViewPager有三页,当我们第一次启动ViewPager显示第一页的时候,ViewPager会预加载第二页, ...
随机推荐
- Django day08 多表操作 (四) 一对多, 多对多连续跨表查询
一对多 # 基于双下划线的一对多查询 # 查询出版社为上海出版社的所有图书 # ret = Publish.objects.filter(name='上海出版社').values('book__nam ...
- 【专题系列】单调队列优化DP
Tip:还有很多更有深度的题目,这里不再给出,只给了几道基本的题目(本来想继续更的,但是现在做的题目不是这一块内容,以后有空可能会继续补上) 单调队列——看起来就是很高级的玩意儿,显然是个队列,而且其 ...
- maven添加本地jar包的方法
1.将一个本地的jar包随便放在一个放入本地文件夹中 (文件夹位置 和 jar包名称都随意) 例:F:\java\repository\a 文件夹下,名称为:icepdf-core-6.0.jar 2 ...
- 自定义View(6)paint设置两个图层相交时的显示方式,包含清空canvas
1.问题 在已有的图层上绘图将会在其上面添加一层新的图层. 如果新的图层是完全不透明的,那么它将完全遮挡住下面的图层,而setXfermode就可以来解决这个问题.这个函数设置两个图层相交时的模式 . ...
- 使用 SqlBulkCopy 批量插入数据
/// <summary> /// 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// </summary> /// <param name= ...
- C#微信公众号的开发——服务配置
最近因为需要用C#开发微信公众号的一些功能,记录一下开发公众号的一些坑..... 首先先介绍一下,微信公众号的官方文档.虽然这个文档我感觉比较糙,但是还是可以借鉴一下让我们摸着石头过河的. 首先我们得 ...
- AndroidStudio怎样导入library项目库
先打开一个Project,然后将libraryr的项目作为module进行导入: File菜单->import module菜单 以上只是导入进来,还没有作为与project真正有效的一部分.需 ...
- classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList();
package a927; import java.util.ArrayList; import java.util.List; class Student { private String name ...
- ★Java语法(二)——————————数据类型常见问题
1.用float型定义变量:float a = 3.14 :是否正确? 不正确.“=” 两边的精度类型不匹配,应为:float a =(float)3.14 或 float a =3.14F 或 ...
- 【Oracle】rollup函数
当我们在做报表统计的时候,很多时候需要用到‘合计’这个功能,比如我们想得到如下格式的报表: 这张表是按照deptno分组,然后按照deptno分组合计.rollup函数可以完美的解决这个问题. 1.建 ...