Android 利用线程运行栈StackTraceElement设计Android日志模块
2016-11-08 15:23
471 查看
如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢?
在onCreate方法中调用getStackTrace方法获取调用栈的信息。打印的结果如下:
观察输出结果可以看出栈中先执行的方法是VM和Thread中的方法。第3条才是你调用所在的方法(调用getStackTrack的方法)。
CustomTagPrefix是自定义的前缀。 包装LOG:
getStackTrace()[3],取第四个的原因是前两个分别为vm和Thread的方法,下标2是当前的d()方法,调用d()的方法的下标为3。
1.引入Java的线程运行栈
Java.lang包中提供了StackTraceElement,可以用来获取方法的调用栈信息。通过调用线程函数Thread.currentThread().getStackTrace()可以获得StackTraceElement[]的堆栈数组,数组中保存了线程中的执行调用的方法。观察下面的代码:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); System.out.println("call oncreate method"); System.out.println("stacktrace len:" + stacktrace.length); for (int i = 0; i < stacktrace.length; i++) { System.out.println("---- the " + i + " element ----"); System.out.println("toString: " + stacktrace[i].toString()); System.out.println("ClassName: " + stacktrace[i].getClassName()); System.out.println("FileName: " + stacktrace[i].getFileName()); System.out.println("LineNumber: " + stacktrace[i].getLineNumber()); System.out.println("MethodName: " + stacktrace[i].getMethodName()); } }
在onCreate方法中调用getStackTrace方法获取调用栈的信息。打印的结果如下:
观察输出结果可以看出栈中先执行的方法是VM和Thread中的方法。第3条才是你调用所在的方法(调用getStackTrack的方法)。
2.日志模块设计
生成tag:private static String generateTag(StackTraceElement stack){ String tag = "%s.%s(L:%d)"; String className = stack.getClassName(); className = className.substring(className.lastIndexOf(".")+1); tag = String.format(tag, stack.getClassName(),className,stack.getLineNumber()); tag = customTagPrefix==null?tag:customTagPrefix+":"+tag; return tag; }
CustomTagPrefix是自定义的前缀。 包装LOG:
public static void d(String content){ if (!allowD) { return ; } StackTraceElement caller = Thread.currentThread().getStackTrace()[3]; String tag = generateTag(caller); Log.d(tag, content); } public static void d(String content,Throwable thr){ if (!allowD) { return; } StackTraceElement caller = Thread.currentThread().getStackTrace()[3]; String tag = generateTag(caller); Log.d(tag, content,thr); }
getStackTrace()[3],取第四个的原因是前两个分别为vm和Thread的方法,下标2是当前的d()方法,调用d()的方法的下标为3。
相关文章推荐
- 利用线程运行栈StackTraceElement设计Android日志模块
- 利用线程运行栈StackTraceElement设计Android日志模块
- 利用线程运行栈StackTraceElement设计Android日志模块
- 使用线程执行堆栈StackTraceElement设计Android日志模块
- 运行日志模块的设计和实现
- 利用线程运行栈StackTraceElement设计Android日志模块
- Linux BT下载(10)-出错处理模块和运行日志模块设计
- Android 应用程序模块: 应用, 任务, 进程, 和线程
- Android 利用【Hierarchy Viewer 】 工具学习别人的UI设计
- [转载]Android界面设计学习日志(一)
- 官方文档:Android应用程序运行的性能设计
- 官方文档:Android应用程序运行的性能设计
- Android 线程始终运行之我见
- [转载]Android界面设计学习日志(二)
- Android Binder机制の设计与实现6-7(Binder 内存映射和接收缓存区管理/Binder 接收线程管理)
- Android中利用画图类和线程画出闪烁的心形,送给亲爱的他
- Android应用程序框架层和系统运行库层日志系统源代码分析
- 利用ajax作一实时日志系统查询模块,和感兴趣的同行交流一下!
- 利用ACE日志策略进行日志运行时配置管理
- S3C6410 Copybit Android 模块设计心得--转载