Android 利用线程运行栈StackTraceElement设计Android日志模块
如果你想在你的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日志模块的更多相关文章
- 使用线程执行堆栈StackTraceElement设计Android日志模块
假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现? 1.介绍Java线程执行堆栈 Java.lang包中 ...
- Java高级--Java线程运行栈信息的获取 getStackTrace()
我们在Java程序中使用日志功能(JDK Log或者Log4J)的时候,会发现Log系统会自动帮我们打印出丰富的信息,格式一般如下:为了免去解析StackTrace字符串的麻烦,JDK1.4引入了一个 ...
- Android利用ViewPager仿微信主界面-android学习之旅(78)
首先是介绍ViewPager这个控件 ,这个控件需要pagerAdapter作为容器来提供数据,同时pagerAdapter的数据源是View数组 效果图如下 部分代码如下,实现如下的方法 mPage ...
- android 利用线程刷新UI方法
新建线程new Thread(new Runnable() 线程方法:public void run() private void setAddWidgetEnabled(boolean enable ...
- Android 利用Application对象存取公共数据
本文章来给大家介绍Android 利用Application对象存取公共数据. Android系统在运行每一个程序应用的时候,都会创建一个Application对象,用于存储与整个应用相关的公共变量. ...
- android 的线程模型和AsyncTask
android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图 ...
- android操作线程各种方法解析
(一)刚开始学习android的时候我是这么写的 new Thread( new Runnable() { public void run() { myView.invalidate(); } }). ...
- 使用Jquery Mobile设计Android通讯录
本系列教程将指导大家一步步使用Jquery Mobile设计一个Android的通讯录应用.其中在应用的界面部分,将使用jQuery Mobile框架,并且会指导大家如何使Android中提供的web ...
- 【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask
方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...
随机推荐
- code blocks常用快捷键
CodeBlocks常用操作快捷键 编辑部分: Ctrl + A:全选 Ctrl + C:复制 Ctrl + X: 剪切 Ctrl + V:粘贴 Ctrl + Z:撤销(后退一步) Ctrl + S: ...
- TrueSec引导的Linux系统和安全检测工具预览
650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=&qu ...
- golang beego cache
package main import ( "fmt" "github.com/astaxie/beego/cache" "time" ) ...
- Android系统如何管理自己内存的?
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上. 安卓是基于Linux2.6内核的 ...
- Core Animation 文档翻译—附录A(Layer样貌相关属性动画)
前言 在渲染过程中,核心动画获取Layer的各种属性并以特定的顺序渲染他们.这个顺序决定了Layer的最终的样貌.本节将会阐述通过设置不同的Layer样貌相关属性对应产生的渲染结果. 注意:Mac ...
- vue实现多语言国际化(vue-i18n),结合element ui、vue-router、echarts以及joint等。
老板说我们的项目要和国际接轨,于是乎,加上了多语言(vue-i18n).项目用到的UI框架是element ui ,后续echarts.joint等全都得加上多语言. 一.言归正传,i18n在vue项 ...
- menuconfig_kconfig
这一节的主要内容: Menuconfig的操作 Kconfig和.config文件 Linux内核配置裁剪实验 linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉 menuco ...
- C#中对XML的操作
现在有一个xml文件,名称:BookStore.xml,数据如下: <?xml version="1.0" encoding="gb2312"?>& ...
- valueof(), intvalue(0 parseint() 这三个方法怎么用
valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例.valueOf(String s) 返回保存指定的 String 的值的 Integer 对象.valueOf(S ...
- JAVE 视音频转码
http://blog.csdn.net/qllinhongyu/article/details/29817297