利用线程运行栈StackTraceElement设计Android日志模块
如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢?
1.引入Java的线程运行栈
@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方法获取调用栈的信息。打印的结果如下:
2.日志模块设计
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是自定义的前缀。
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。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。