在開發的過程中我們經常需要偵錯工具的執行路徑,如我們想知道一個Activity的生命週期方法的調用順序,我們可能會寫如下代碼
Java代碼
1. .....
2. public void onResume() {
3. super.onResume();
4. Log.d("Tag","onResume()");
5. }
6.
7. public void onStart() {
8. super.onStart();
9. Log.d("Tag","onStart()");
10. }
11.
12. public void onPause() {
13. super.onPause();
14. Log.d("Tag","onPause()");
15. }
16.
17. public void onStop() {
18. super.onStop();
19. Log.d("Tag","onStop()");
20. }
21.
22. ...
這樣每次都要輸入兩個參數,有沒有更簡便的方法呢?
我們可以通過Thread.currentThread().getStackTrace()擷取當前堆棧調用資訊,從堆棧資訊中可以擷取當前調用的java檔案名稱,類名,方法名和程式碼號。
於是,我們封裝了一個工具類LogHelper。我們只需要使用這個工具類,在跟蹤的位置調用LogHelper.trace()方法就可以列印當前調用方法的資訊。
例子:列印Activity的生命週期方法執行流程。
Loghelper.java代碼
1. package cn.caiwb;
2.
3. import android.util.Log;
4.
5. public final class LogHelper {
6. private static boolean mIsDebugMode = true;//擷取堆棧資訊會影響效能,發布應用時記得關閉DebugMode
7. private static String mLogTag = "LogHelper";
8.
9. private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s() Line:%d (%s)";
10.
11. public static void trace() {
12. if (mIsDebugMode) {
13. StackTraceElement traceElement = Thread.currentThread()
14. .getStackTrace()[3];//從堆棧資訊中擷取當前被調用的方法資訊
15. String logText = String.format(CLASS_METHOD_LINE_FORMAT,
16. traceElement.getClassName(), traceElement.getMethodName(),
17. traceElement.getLineNumber(), traceElement.getFileName());
18. Log.d(mLogTag, logText);//列印Log
19. }
20. }
21. }
Loghelperactivity.java 代碼
1. package cn.caiwb;
2.
3. import android.app.Activity;
4. import android.os.Bundle;
5. import android.util.Log;
6.
7. public class LogHelperActivity extends Activity {
8. /** Called when the activity is first created. */
9.
10.
11. @Override
12. public void onCreate(Bundle savedInstanceState) {
13. super.onCreate(savedInstanceState);
14. setContentView(R.layout.main);
15. LogHelper.trace();
16. }
17.
18.
19. @Override
20. public void onStart() {
21. super.onStart();
22. LogHelper.trace();
23. }
24.
25. @Override
26. public void onResume() {
27. super.onResume();
28. LogHelper.trace();
29. }
30.
31. @Override
32. public void onPause() {
33. super.onPause();
34. LogHelper.trace();
35. }
36.
37. @Override
38. public void onStop() {
39. super.onStop();
40. LogHelper.trace();
41. }
42.
43. @Override
44. public void onDestroy() {
45. super.onDestroy();
46. LogHelper.trace();
47. }
48. }
Log列印結果
總結:
通過使用LogHelper的trace()方法,在調試的時候我們可以非常方便地列印應用的執行流程
摘自 caiwb1990