利用线程运行栈StackTraceElement设计Android日志模块

Posted tangjiean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用线程运行栈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 = 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日志模块的主要内容,如果未能解决你的问题,请参考以下文章

RT-Thread 判断线程栈使用大小

RT-Thread 判断线程栈使用大小

RT-Thread 判断线程栈使用大小

RT-Thread 判断线程栈使用大小

用java编写程序,利用线程同步编写一个栈操作程序,包括数据的进栈和出栈。

java 中打印调用栈