zoukankan      html  css  js  c++  java
  • 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 = 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。 

  • 相关阅读:
    ppt标签打开文件 word标签打开文件 窗口打开文件 粘贴默认方式
    .net 执行sql包含go语句的处理
    vs创建项目模板和项模板
    base64和图片的转换
    Map工具系列-05-添加业务参数工具
    winform刷新UI界面
    System.Diagnostics.Process.Star的用法
    wpf打开文夹和打开文件
    wpf *和auto的区别
    WPF基础到企业应用系列6——布局全接触
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/6043201.html
Copyright © 2011-2022 走看看