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。 

  • 相关阅读:
    [Linux] 解决CentOS下Requires: libjson-c.so错误
    磁盘分区就是这么简单,电脑小白都能看懂的磁盘分区教程!
    Linux常见压缩、解压缩
    安装/删除MySQL数据库
    MapReduce与Yarn 的详细工作流程分析
    SQL 增、删、改、查语句
    Apache Kylin 概述
    DHCP服务器配置及测试
    忘记root密码
    记第一次重装系统
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/6043201.html
Copyright © 2011-2022 走看看