博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 利用线程运行栈StackTraceElement设计Android日志模块
阅读量:5923 次
发布时间:2019-06-19

本文共 2208 字,大约阅读时间需要 7 分钟。

如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢?

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。 

转载地址:http://wwavx.baihongyu.com/

你可能感兴趣的文章
一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路
查看>>
51 个漂亮的电子商务网站设计分享
查看>>
[代码健壮性] 学会同时关注代码的正面和反面情况,提高系统健壮性
查看>>
SQL Server标量值函数-汉字转拼音
查看>>
zz 使用svn——项目的目录布局
查看>>
UNION和UNION ALL的用法区别
查看>>
如何充分利用时间碎片学习新东西--敏捷阅读
查看>>
linux下WordPress文件夹权限设置
查看>>
GC in C# and Python
查看>>
各种国家标准代码表
查看>>
解决Eclipse进行Android开发时logcat不显示问题-使用DDMS
查看>>
[Step By Step]SAP HANA中创建分析权限(Analytic Privilege)
查看>>
黑马程序员:Java基础总结----java注解
查看>>
ASP.NET4.5Web API及非同步程序开发系列(2)
查看>>
ny42 一笔画问题
查看>>
Linux硬盘速度测试的命令
查看>>
转载:Struts2支持断点续传下载实现
查看>>
OpenStack三个节点icehouse-gre模式部署
查看>>
Android SDK Manager 更新代理配置
查看>>
log4j
查看>>