如果你想在你的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 = ; 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(".")+);
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()[];
String tag = generateTag(caller);
Log.d(tag, content);
} public static void d(String content,Throwable thr){
if (!allowD) {
return;
}
StackTraceElement caller = Thread.currentThread().getStackTrace()[];
String tag = generateTag(caller);
Log.d(tag, content,thr);
}

getStackTrace()[3],取第四个的原因是前两个分别为vm和Thread的方法,下标2是当前的d()方法,调用d()的方法的下标为3。

Android 利用线程运行栈StackTraceElement设计Android日志模块的更多相关文章

  1. 使用线程执行堆栈StackTraceElement设计Android日志模块

    假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现? 1.介绍Java线程执行堆栈  Java.lang包中 ...

  2. Java高级--Java线程运行栈信息的获取 getStackTrace()

    我们在Java程序中使用日志功能(JDK Log或者Log4J)的时候,会发现Log系统会自动帮我们打印出丰富的信息,格式一般如下:为了免去解析StackTrace字符串的麻烦,JDK1.4引入了一个 ...

  3. Android利用ViewPager仿微信主界面-android学习之旅(78)

    首先是介绍ViewPager这个控件 ,这个控件需要pagerAdapter作为容器来提供数据,同时pagerAdapter的数据源是View数组 效果图如下 部分代码如下,实现如下的方法 mPage ...

  4. android 利用线程刷新UI方法

    新建线程new Thread(new Runnable() 线程方法:public void run() private void setAddWidgetEnabled(boolean enable ...

  5. Android 利用Application对象存取公共数据

    本文章来给大家介绍Android 利用Application对象存取公共数据. Android系统在运行每一个程序应用的时候,都会创建一个Application对象,用于存储与整个应用相关的公共变量. ...

  6. android 的线程模型和AsyncTask

            android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图 ...

  7. android操作线程各种方法解析

    (一)刚开始学习android的时候我是这么写的 new Thread( new Runnable() { public void run() { myView.invalidate(); } }). ...

  8. 使用Jquery Mobile设计Android通讯录

    本系列教程将指导大家一步步使用Jquery Mobile设计一个Android的通讯录应用.其中在应用的界面部分,将使用jQuery Mobile框架,并且会指导大家如何使Android中提供的web ...

  9. 【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

随机推荐

  1. nls 字符编码文件对应的国家语言

    原文 http://ftp.twaren.net/cpatch/faq/tech/tech_nlsnt.txt * updated by Kii Ali, 12-11-2001 ftp://ftp.n ...

  2. Shelled-out Commands In Golang

    http://nathanleclaire.com/blog/2014/12/29/shelled-out-commands-in-golang/ Shelled-out Commands In Go ...

  3. Switchover and Failover说明

    SWITCHOVER Switchover是有计划的将primary切换为standby,standby切换为primary.在主库结束生产后,备库应用完所有主库archivelog或者redo lo ...

  4. 如果把父组件的数据实时的传递到子组件:用watch

    1.在子组件使用watch来监听传递给子组件的数据,然后更新子组件的数据. 2.watch和computed结合使用效果非常好. 参考链接:https://blog.csdn.net/zhouweix ...

  5. HDU 4631 Sad Love Story 平面内最近点对

    http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短 ...

  6. Docker+Mongodb

    原文:Docker+Mongodb docker search mongodb docker run -d -p 2701:27017 -v /usr/mongodb/data:/data/db  - ...

  7. MySQL 汉字拼音

    http://blog.csdn.net/u012076316/article/details/54951365 http://www.cnblogs.com/diony/p/5483108.html ...

  8. Java 函数的参数说

    java函数参数传递的到底是值还是引用对确实容易让人迷糊.而很多时候因为对这个问题的模糊甚至造成一些错误.最常见的说法是基本类型传的是值,对象传的引用.对于基本类型,大家都达成共识,没有什么可以争论的 ...

  9. 06 Jenkins自动化构建

    • 在之前的freestyle任务基础上,实现构建功能• 检查maven环境• 构建命令:mvn clean compile• 归档构建产物• 演练参数的使用• 通过配置Trigger进行自动构建• ...

  10. Mongodb总结6-数据库启动、停止、备份等命令

    #启动Mongodb默认启动,需要在/data/db,Windows下对应的目录是Mongod.exe所在磁盘分区的根目录,例如Mongodb存放在D:/Mongodb,那么对应的路径就是D:/dat ...