快速开发系列 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. iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...

  2. Hadoop数据传输工具:Sqoop

    Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流.用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Had ...

  3. JAVA线程池ThreadPoolExecutor-转

    首先是构造函数签名如下: public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeU ...

  4. python psutil 模块

    一.获取系统性能信息 1 .CPU信息 User time,执行用户进程的时间百分比 System time,执行内核进程和中断的百分比 Wait IO,由于IO等待而使CPU处于idle(空闲)状态 ...

  5. linux Shell的使用

    linux Shell的使用 下面是我对shell脚本使用的学习,写成日志,做个笔记,可以当做自己以后的复习. 1.输出hello world! vi test1.sh, 如果不会vi工具的使用,请参 ...

  6. 多线程编程之Windows同步方式

    在Windows环境下针对多线程同步与互斥操作的支持,主要包括四种方式:临界区(CriticalSection).互斥对象(Mutex).信号量(Semaphore).事件对象(Event).下面分别 ...

  7. 从客户端中检测到有潜在危险的Request.Form值 的解决方法

    在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止X ...

  8. bzoj1201: [HNOI2005]数三角形

    Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...

  9. Winfrom DateGridView 实现Button列禁用

    Form窗体如下所示: 实现如下: using System; using System.Collections.Generic; using System.Drawing; using System ...

  10. Mongodb集群搭建及spring和java连接配置记录

    一.基本环境: mongdb3.0.5数据库 spring-data-mongodb-1.7.2.jar mongo-java-driver-3.0.2.jar linux-redhat6.3 tom ...