快速开发系列 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. windows知识点

    https://technet.microsoft.com/zh-cn/windows/dd641430  win7相关资源 23. Remtoe FX是微软WIN2008 R2的SP1新功能首先您需 ...

  2. Intent的详细解析以及用法

    Intent的详细解析以及用法      Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...

  3. python函数: 内置函数

    forthttp://blog.csdn.net/pipisorry/article/details/44755423 Python内置函数 Python内置(built-in)函数随着python解 ...

  4. Amoeba:开源的分布式数据库Porxy解决方案

    http://www.biaodianfu.com/amoeba.html 什么是Amoeba? Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件 ...

  5. Oracle内存参数配置及版本问题

    Oracle的内存配置与Oracle性能息息相关.从总体上讲,可以分为两大块:共享部分(主要是SGA)和进程独享部分(主要是PGA).在 32 位操作系统下 的Oracle版本,不时有项目反馈关于内存 ...

  6. JSP的Servlet监听器

    JSP的Servlet监听器 来源: http://blog.csdn.net/phoenix_17th/article/details/3868670 Servlet 监听器用于监听一些重要事件的发 ...

  7. Eclipse的中文字体设置

    打开eclipse中文字体很小,简直难以辨认.在网上搜索发现这是由于Eclipse 用的字体是 Consolas,显示中文的时候默认太小了.解决方式有两种:一.把字体设置为Courier New  操 ...

  8. 【转】调试Release发布版程序的Crash错误

    http://www.cppblog.com/Walker/archive/2012/11/08/146153.html http://blog.sina.com.cn/s/blog_48f93b53 ...

  9. Visual对象之DrawingContext.DrawRectangle在有的状态下似乎并不能提高性能

    很多书上都提到使用Visual对象绘制图形可以提高绘图效率,但是经过本人亲测,结果却发现DrawingContext.DrawRectangle的效率远低于使用UIElement.Children.A ...

  10. bzoj2338 数矩形

    给出N(N≤1500)个点,求选四个点作为顶点组成矩形的最大面积,保证有解. 对每两个点连边,按边长排序,枚举等长且中点相同的边作为对角线组成矩形,计算面积取最大值. 时间复杂度O(n2logn) # ...