zoukankan      html  css  js  c++  java
  • 使用线程执行堆栈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。
      
           
       



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Qbxt 模拟题 day2(am) T2 jian
    Codevs 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组
    洛谷比赛 U5442 买(最长链)
    洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
    Codevs 4373 窗口(线段树 单调队列 st表)
    P1453 城市环路
    P1841 [JSOI2007]重要的城市
    P1410 子序列
    H
    GSS4 D
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4668613.html
Copyright © 2011-2022 走看看