利用线程运行栈StackTraceElement设计Android日志模块
来源:互联网 发布:intro.js 编辑:程序博客网 时间:2024/05/22 12:19
如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢?
1.引入Java的线程运行栈
Java.lang包中提供了StackTraceElement,可以用来获取方法的调用栈信息。通过调用线程函数Thread.currentThread().getStackTrace()可以获得StackTraceElement[]的堆栈数组,数组中保存了线程中的执行调用的方法。观察下面的代码:
- @Override
- rotected 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());
- }
观察输出结果可以看出栈中先执行的方法是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;
- }
包装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);
- }
转自:http://blog.csdn.net/tangjiean/article/details/38823239
0 0
- 利用线程运行栈StackTraceElement设计Android日志模块
- 利用线程运行栈StackTraceElement设计Android日志模块
- 利用线程运行栈StackTraceElement设计Android日志模块
- 利用线程运行栈StackTraceElement设计Android日志模块
- Android——StackTraceElement线程运行栈的探索
- Android中的日志输出(StackTraceElement)
- android中StackTraceElement栈格式
- 运行日志模块的设计和实现
- java StackTraceElement 日志
- Android——使用StackTraceElement实现自己的Log日志输出管理类
- android StackTraceElement的一些用法
- 日志模块设计
- Linux BT下载(10)-出错处理模块和运行日志模块设计
- 关于日志模块的设计
- 服务器设计系列:日志模块
- 通用日志(Log)模块设计
- Android 从StackTraceElement反观Log库
- Android 从StackTraceElement反观Log库
- php 5.6.19连接数据库
- 11g两节点RAC添加第三个节点
- json和jsonp
- raspberry noobs 系统分区解析与镜像备份
- 包含min函数的栈
- 利用线程运行栈StackTraceElement设计Android日志模块
- LeetCode 226 -Invert Binary Tree ( JAVA )
- 图解opengl 3D 图形绘制实例
- 程序员高效率工作工具推荐(必备工具)
- 颓废的我。。
- WCF 动态调用(动态创建实例接口)
- 使用T-SQL创建、修改数据库
- 开放创新,合作共赢 华为智慧家庭解决方案
- 查找数组中只出现一次的一个数