快速开发系列 10个常用工具类

http://blog.csdn.net/lmj623565791/article/details/38965311

------------------------------------------------------------------------------------------------

不知众多Android开发者是否在程序开发的工程中也遇到过下面的问题:

0.如何在众多log中快速找到你设置打印的那行log?

1.是否还在不断的切换标签来查看使用不同TAG标签打印的log?

2.找到需要的log后是否苦恼不能快速定位到Java源代码中查看?

起初我也和大多数Android开发者一样,使用官方的打印log的方法,设置TAG,在Eclipse里面设置过滤标签,切换来回的看Log,可是这样却效率很低,会遇到上面所述的问题,那么现在我就把学习到的一种方便快捷的打印Log的方法分享给大家,有不对的地方还望不吝赐教,谢谢。

Log类具有的功能

0.使用一个标签来标记当前的AP(避免设置过多的TAG来过滤显示不同Java文件下的Log)

1.支持多用户打印Log(在AP比较大,文件比较多,每人负责的模块不同时,可以使用自己的log来打印,这样看log的时候可以快速筛选出当前AP中你所设置的Log,比如只看     kesen的log就可以在Eclipse的filter里面输入kesen,这样显示的就都是你的log了)

2.显示当前的线程名

3.显示当前的Java文件与打印log的行号,便于快速定位到源文件

4.显示当前是在那个方法体里面

5.最后显示你设置打印出来的信息

下面是一个打印Log的工具类:

  1. /**
  2. * The class for print log
  3. * @author kesenhoo
  4. *
  5. */
  6. public class MyLogger
  7. {
  8. private final static boolean                logFlag         = true;
  9. public final static String                  tag             = "[AppName]";
  10. private final static int                    logLevel        = Log.VERBOSE;
  11. private static Hashtable<String, MyLogger>    sLoggerTable    = new Hashtable<String, MyLogger>();
  12. private String                              mClassName;
  13. private static MyLogger                     jlog;
  14. private static MyLogger                     klog;
  15. private static final String                 JAMES           = "@james@ ";
  16. private static final String                 KESEN           = "@kesen@ ";
  17. private MyLogger(String name)
  18. {
  19. mClassName = name;
  20. }
  21. /**
  22. *
  23. * @param className
  24. * @return
  25. */
  26. @SuppressWarnings("unused")
  27. private static MyLogger getLogger(String className)
  28. {
  29. MyLogger classLogger = (MyLogger) sLoggerTable.get(className);
  30. if(classLogger == null)
  31. {
  32. classLogger = new MyLogger(className);
  33. sLoggerTable.put(className, classLogger);
  34. }
  35. return classLogger;
  36. }
  37. /**
  38. * Purpose:Mark user one
  39. * @return
  40. */
  41. public static MyLogger kLog()
  42. {
  43. if(klog == null)
  44. {
  45. klog = new MyLogger(KESEN);
  46. }
  47. return klog;
  48. }
  49. /**
  50. * Purpose:Mark user two
  51. * @return
  52. */
  53. public static MyLogger jLog()
  54. {
  55. if(jlog == null)
  56. {
  57. jlog = new MyLogger(JAMES);
  58. }
  59. return jlog;
  60. }
  61. /**
  62. * Get The Current Function Name
  63. * @return
  64. */
  65. private String getFunctionName()
  66. {
  67. StackTraceElement[] sts = Thread.currentThread().getStackTrace();
  68. if(sts == null)
  69. {
  70. return null;
  71. }
  72. for(StackTraceElement st : sts)
  73. {
  74. if(st.isNativeMethod())
  75. {
  76. continue;
  77. }
  78. if(st.getClassName().equals(Thread.class.getName()))
  79. {
  80. continue;
  81. }
  82. if(st.getClassName().equals(this.getClass().getName()))
  83. {
  84. continue;
  85. }
  86. return mClassName + "[ " + Thread.currentThread().getName() + ": "
  87. + st.getFileName() + ":" + st.getLineNumber() + " "
  88. + st.getMethodName() + " ]";
  89. }
  90. return null;
  91. }
  92. /**
  93. * The Log Level:i
  94. * @param str
  95. */
  96. public void i(Object str)
  97. {
  98. if(logFlag)
  99. {
  100. if(logLevel <= Log.INFO)
  101. {
  102. String name = getFunctionName();
  103. if(name != null)
  104. {
  105. Log.i(tag, name + " - " + str);
  106. }
  107. else
  108. {
  109. Log.i(tag, str.toString());
  110. }
  111. }
  112. }
  113. }
  114. /**
  115. * The Log Level:d
  116. * @param str
  117. */
  118. public void d(Object str)
  119. {
  120. if(logFlag)
  121. {
  122. if(logLevel <= Log.DEBUG)
  123. {
  124. String name = getFunctionName();
  125. if(name != null)
  126. {
  127. Log.d(tag, name + " - " + str);
  128. }
  129. else
  130. {
  131. Log.d(tag, str.toString());
  132. }
  133. }
  134. }
  135. }
  136. /**
  137. * The Log Level:V
  138. * @param str
  139. */
  140. public void v(Object str)
  141. {
  142. if(logFlag)
  143. {
  144. if(logLevel <= Log.VERBOSE)
  145. {
  146. String name = getFunctionName();
  147. if(name != null)
  148. {
  149. Log.v(tag, name + " - " + str);
  150. }
  151. else
  152. {
  153. Log.v(tag, str.toString());
  154. }
  155. }
  156. }
  157. }
  158. /**
  159. * The Log Level:w
  160. * @param str
  161. */
  162. public void w(Object str)
  163. {
  164. if(logFlag)
  165. {
  166. if(logLevel <= Log.WARN)
  167. {
  168. String name = getFunctionName();
  169. if(name != null)
  170. {
  171. Log.w(tag, name + " - " + str);
  172. }
  173. else
  174. {
  175. Log.w(tag, str.toString());
  176. }
  177. }
  178. }
  179. }
  180. /**
  181. * The Log Level:e
  182. * @param str
  183. */
  184. public void e(Object str)
  185. {
  186. if(logFlag)
  187. {
  188. if(logLevel <= Log.ERROR)
  189. {
  190. String name = getFunctionName();
  191. if(name != null)
  192. {
  193. Log.e(tag, name + " - " + str);
  194. }
  195. else
  196. {
  197. Log.e(tag, str.toString());
  198. }
  199. }
  200. }
  201. }
  202. /**
  203. * The Log Level:e
  204. * @param ex
  205. */
  206. public void e(Exception ex)
  207. {
  208. if(logFlag)
  209. {
  210. if(logLevel <= Log.ERROR)
  211. {
  212. Log.e(tag, "error", ex);
  213. }
  214. }
  215. }
  216. /**
  217. * The Log Level:e
  218. * @param log
  219. * @param tr
  220. */
  221. public void e(String log, Throwable tr)
  222. {
  223. if(logFlag)
  224. {
  225. String line = getFunctionName();
  226. Log.e(tag, "{Thread:" + Thread.currentThread().getName() + "}"
  227. + "[" + mClassName + line + ":] " + log + "\n", tr);
  228. }
  229. }
  230. }

关于里面的代码就不做解释了,大家看看应该差不多

使用案例:
这是我写的一个简单的带有一个button与textview的Activity,演示一下点击button与Activity的常规生命周期。

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.view.View.OnClickListener;
  5. import android.widget.Button;
  6. public class ActivityMain extends Activity
  7. {
  8. private MyLogger logger = MyLogger.kLog();
  9. private MyLogger logger2 = MyLogger.jLog();
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState)
  12. {
  13. // TODO Auto-generated method stub
  14. super.onCreate(savedInstanceState);
  15. logger.i("This is log [01]");
  16. setContentView(R.layout.main);
  17. Button button = (Button) this.findViewById(R.id.button);
  18. button.setOnClickListener(new OnClickListener() {
  19. @Override
  20. public void onClick(View arg0)
  21. {
  22. // TODO Auto-generated method stub
  23. logger2.i("This is James action button.OnClick");
  24. }
  25. });
  26. }
  27. @Override
  28. protected void onResume()
  29. {
  30. // TODO Auto-generated method stub
  31. super.onResume();
  32. logger.d("This is kesen log [02]");
  33. }
  34. @Override
  35. protected void onPause()
  36. {
  37. // TODO Auto-generated method stub
  38. super.onPause();
  39. logger.w("This is kesen log [03]");
  40. }
  41. @Override
  42. protected void onStop()
  43. {
  44. // TODO Auto-generated method stub
  45. super.onStop();
  46. logger.v("This is kesen log [04]");
  47. }
  48. @Override
  49. protected void onDestroy()
  50. {
  51. // TODO Auto-generated method stub
  52. super.onDestroy();
  53. logger.e("This is kesen log [05]");
  54. }
  55. }

下面是用这个log工具类打印出来的Log效果:

从上面的解释差不多可以看出这个Log工具类具有的功能:
0.使用一个标签来标记当前的AP
1.支持多用户打印Log(在AP比较大,文件比较多,每人负责的模块不同时,可以使用自己的log来打印,这样看log的时候可以快速筛选出当前AP中你所设置的Log,比如只看     kesen的log就可以在Eclipse的filter里面输入kesen,这样显示的就都是你的log了)
2.显示当前的线程名
3.显示当前的Java文件与打印log的行号,便于快速定位到源文件
4.显示当前是在那个方法体里面
5.最后显示你设置打印出来的信息

写的不好,有不对的地方还请见谅,谢谢!

封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类的更多相关文章

  1. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  2. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

  3. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  4. 代码改变世界 | 如何封装一个简单的 Koa

    下面给大家带来:封装一个简单的 Koa Koa 是基于 Node.js 平台的下一代 web 开发框架 Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装 ...

  5. Directx11学习笔记【四】 封装一个简单的Dx11DemoBase

    根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...

  6. 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件

    先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...

  7. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  8. 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?

    历史溯源 由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP.FTP.POP3.SMTP.Telnet等.早期操作系统UNIX( ...

  9. vue封装一个简单的div框选时间的组件

    记录一下我前段时间封装的一个vue组件吧.技术需要积累,有时间我把我之前写的还不错的组件都开源出来.并尝试vue和react 两种方式的组件封装.今天简单写下鼠标框选div选中效果的封装吧. div框 ...

随机推荐

  1. 【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)

    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息        /// 截获消息  处理XP不能关机问题        protected ...

  2. 【转】个人最常用的Eclipse快捷键

      记录下自己在Eclipse中最常使用的快捷键: 其实网上总结多的是,自己记录下自己平时最切身受益的一些快捷键. 1.SHIFT+ ALT+Z(刚学的): 条件:选中一段代码 会弹出上面的右键菜单, ...

  3. TKinter布局之grid 网格布局

    1.由于我们的程序大多数都是矩形,因此特别适合于网格 布局,也就是 grid 布局. 2.使用 grid 布局的时候,我们使用 grid 函数,在里面指 定两个参数,用 row 表示行,用 colum ...

  4. openssl数字证书私钥删除私钥密码

    解密 openssl rsa -in server.key.org -out server.key

  5. 关于SQLServer2005的学习笔记—异常捕获及处理

    转自:http://blog.csdn.net/baoqiangwang/article/details/5395874 SQLServer2005 提供了类似于 C# 和 C++ 语言中的异常处理的 ...

  6. [linux] cp: omitting directory `XXX'问题解决

    在linux系统中复制文件夹时提示如下: cp: omitting directory `foldera/' 其中foldera是我要复制的文件夹名,出现该警告的原因是因为foldera目录下还存在目 ...

  7. C++工程编译之“error LNK2001: 无法解析的外部符号”

    今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是 ...

  8. 设计师必看的10个HTML5动画工具

    如果你想用令人难以置信的动画创建引人注目的网站的话,那么这里为设计师精心挑选了一些必备的HTML5动画工具.HTML5是设计师用来打造时尚网站的最流行的编程语言之一.在过去三年内,这种编程语言的使用人 ...

  9. windows p12(pfx)个人证书安装过程

    证书库个人证书存储区为其中的每个证书维护一个属性CERT_KEY_PROV_INFO_PROP_ID,该属性指定了证书对应的密钥容器的相关信息,包括密钥容器名,CSP名称,CSP类型,密钥用途,以及C ...

  10. Python Beautiful Soup模块的安装

    以安装Beautifulsoup4为例: 1.到网站上下载:http://www.crummy.com/software/BeautifulSoup/bs4/download/ 2.解压文件到C:\P ...