2025-02-10

介紹:在開發的過程中我們經常需要調試程序的執行路徑,如我們想知道一個Activity的生命周期方法的調用順序,我們可能會寫如下代碼:

view plain
….. 
public void onResume() { 
    super.onResume(); 
    Log.d("Tag","onResume()"); 

 
public void onStart() { 
    super.onStart(); 
    Log.d("Tag","onStart()"); 

 
public void onPause() { 
    super.onPause(); 
    Log.d("Tag","onPause()"); 

 
public void onStop() { 
    super.onStop(); 
    Log.d("Tag","onStop()"); 

 
… 

這樣每次都要輸入兩個參數,有沒有更簡便的方法呢?
我們可以通過Thread.currentThread().getStackTrace()獲取當前堆棧調用信息,從堆棧信息中可以獲取當前調用的java文件名,類名,方法名和代碼行號。

於是,我們封裝瞭一個工具類LogHelper。我們隻需要使用這個工具類,在跟蹤的位置調用LogHelper.trace()方法就可以打印當前調用方法的信息。

例子:打印Activity的生命周期方法執行流程。

LogHelper.java

view plain
package com.zhuozhuo; 
 
import android.util.Log; 
 
public final class LogHelper { 
    private static boolean mIsDebugMode = true;//獲取堆棧信息會影響性能,發佈應用時記得關閉DebugMode 
    private static String mLogTag = "LogHelper"; 
 
    private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s()  Line:%d  (%s)"; 
 
    public static void trace() { 
        if (mIsDebugMode) { 
            StackTraceElement traceElement = Thread.currentThread() 
                    .getStackTrace()[3];//從堆棧信息中獲取當前被調用的方法信息 
            String logText = String.format(CLASS_METHOD_LINE_FORMAT, 
                    traceElement.getClassName(), traceElement.getMethodName(), 
                    traceElement.getLineNumber(), traceElement.getFileName()); 
            Log.d(mLogTag, logText);//打印Log 
        } 
    } 

LogHelperActivity.java
view plain
package com.zhuozhuo; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
 
public class LogHelperActivity extends Activity { 
    /** Called when the activity is first created. */ 
     
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        LogHelper.trace(); 
    } 
     
     
    @Override 
    public void onStart() { 
        super.onStart(); 
        LogHelper.trace(); 
    } 
     
    @Override 
    public void onResume() { 
        super.onResume(); 
        LogHelper.trace(); 
    } 
     
    @Override 
    public void onPause() { 
        super.onPause(); 
        LogHelper.trace(); 
    } 
     
    @Override 
    public void onStop() { 
        super.onStop(); 
        LogHelper.trace(); 
    } 
     
    @Override 
    public void onDestroy() { 
        super.onDestroy(); 
        LogHelper.trace(); 
    } 

Log打印結果:


總結:

通過使用LogHelper的trace()方法,在調試的時候我們可以非常方便地打印應用的執行流程。

作者“lzc的專欄”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *