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会预加载第二页, ...
随机推荐
- ASP.NET Core 多环境
ASP.NET Core 支持在多个环境中管理应用程序,如开发(Development),预演(Staging)和生产(Production).环境变量用来指示应用程序正在运行的环境,允许应用程序适当 ...
- Android 清空缓存
APP开发中常有计算缓存大小和清空缓存的功能,此功能很常见,几乎每个应用都能看到,下面就用代码来实现此功能: 步骤为: 1.获取缓存路径 获取长时间保存的文件,Context.getExternalF ...
- poj2376 Cleaning Shifts 区间贪心
题目大意: (不说牛了) 给出n个区间,选出个数最少的区间来覆盖区间[1,t].n,t都是给出的. 题目中默认情况是[1,x],[x+1,t]也是可以的.也就是两个相邻的区间之间可以是小区间的右端与大 ...
- 【PostgreSQL-9.6.3】extract函数
extract函数格式: extract (field from source) extract函数是从日期或者时间数值里面抽取子域,比如年.月.日等.source必须是timestamp.time. ...
- 【PostgreSQL-9.6.3】log参数的设置
编辑数据目录中的postgresql.conf参数文件,我的数据目录是/usr/local/pgsql/data vi postgresql.conf 找到如下内容: ... #----------- ...
- mongodb 下载与安装文档
MongoDB数据库安装及配置环境(windows10系统) windows10系统下MongoDB的安装及环境配置: MongoDB的安装 下载地址: https://www.mongodb.c ...
- excel 打开显示安装office自定义项 安装期间出错的解决方法
用管理员身份运行EXCEL,转到COM加载项,删除对应加载项,即可. 注:上下两张图中的加载项信息不一致,仅作图示参考.
- Spring AOP之静态代理
软件151 李飞瑶 一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只 ...
- 【sqli-labs】 less26a GET- Blind based -All you SPACES and COMMENTS belong to us -String-single quotes-Parenthesis(GET型基于盲注的去除了空格和注释的单引号括号注入)
这个和less26差不多,空格还是用%a0代替,26过了这个也就简单了 ;%00 可以代替注释,尝试一下 order by 3 http://192.168.136.128/sqli-labs-mas ...
- JS的Key-Val(键值对)设置Key为动态的方法
问题描述: 需要生成一个对象, 这个对象为 {key: value}, 现在要让key是动态的 解决方案: function(key, value){ let keyValue = {}; keyVa ...