利用線程運行棧StackTraceElement設計Android日誌模組

來源:互聯網
上載者:User

利用線程運行棧StackTraceElement設計Android日誌模組

如果你想在你的Android程式中自動列印MainActivity.onCreate(line:37)這種類名.方法名(行數)的日誌該如何?呢?

1.引入Java的線程運行棧 Java.lang包中提供了StackTraceElement,可以用來擷取方法的調用棧資訊。通過調用線程函數Thread.currentThread().getStackTrace()可以獲得StackTraceElement[]的堆棧數組,數組中儲存了線程中的執行調用的方法。觀察下面的代碼:
  @Overrideprotected 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。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.