Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 利用線程運行棧StackTraceElement設計Android日志模塊

利用線程運行棧StackTraceElement設計Android日志模塊

編輯:關於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。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved