Android Log使用經驗記錄

Android 中的Log類在調試過程中用來輸出一些調試信息,或者用來分析程序執行流程。

我在開始接觸android時常常如下使用

@Override

protected void onRestart() {

Log.i("TestActivity","onRestart");

super.onRestart();

}

@Override

protected void onStart() {

Log.i("TestActivity","onStart");

super.onStart();

}

@Override

protected void onResume() {

Log.i("TestActivity","onResume");

super.onResume();

}

這裏就有一個問題,這裏的tag被重複寫了N次,如果要修改也要修改N處,顯然是不好的。

需要改進一下,定義一個變量,修改只需要改一處就好。其實Android的代碼也是這樣的。

增加變量 private static final String TAG = "TestActivity";


@Override

protectedvoidonStart() {

Log.i(TAG,"onStart");

super.onStart();

}

@Override

protectedvoidonResume() {

       Log.i(TAG,"onResume");

super.onResume();

}

@Override

protectedvoidonStop() {

Log.i(TAG,"onStop");

super.onStop();

}


在軟件開發完成了,用不到的代碼不應該存在,調試的信息也應該關閉之,比如上面代碼中加的log信息,
這樣就需要去一個一個刪除之,很不爽,關鍵是萬一有bug,需要有些信息,又得添加一遍,顯然不是個好事情。
所以進一步做了修改。添加一個開關,private static final Boolean LOG_OUT = true;


@Override

protectedvoid onStart() {

if(LOG_OUT) Log.i(TAG, "onStart");

super.onStart();

}

@Override

protectedvoidonResume() {

if(LOG_OUT)Log.i(TAG,"onResume");

super.onResume();

}

@Override

protectedvoidonStop() {

if(LOG_OUT)Log.i(TAG,"onStop");

super.onStop();

}


新問題又來了,if(LOG_OUT)在代碼中多次出現,看着也不爽,我又做了下改進,新增加一個類

publicclassMLog {

privatestaticfinalBooleanLOG_OUT=true;


publicstaticintd(String TAG, String msg) {

if (!LOG_OUT) {

return-1;

}

returnLog.d(TAG,msg);

}


publicstaticinti(String TAG, String msg) {

if(!LOG_OUT){

return-1;

}

returnLog.i(TAG,msg);

}


publicstaticintv(String TAG, String msg) {

if(!LOG_OUT){

return-1;

}

returnLog.v(TAG,msg);

}


publicstaticintw(String TAG, String msg) {

if(!LOG_OUT){

return-1;

}

returnLog.w(TAG,msg);

}


publicstaticinte(String TAG, String msg) {

if(!LOG_OUT){

return-1;

}

returnLog.e(TAG,msg);

}

}


修改後的代碼如下:

@Override

protectedvoidonStart() {

MLog.i(TAG,"onStart");

super.onStart();

}

@Override

protectedvoidonResume() {

MLog.i(TAG,"onResume");

super.onResume();

}

@Override

protectedvoidonStop() {

MLog.i(TAG,"onStop");

super.onStop();

}


這裏有個注意點,publicstaticintv(String TAG, Stringmsg)這裏的行參TAG

android風格來看這裏應該用tag比較統一,但是在我編碼的過程中發現(由於我是用eclipse自動提示),

這裏改爲大寫比較方便,因爲我一般在代碼裏定義tag變量爲TAG,這樣自動提升是,就正好是TAG


我常常會跟程序流程,publicstaticintv(String TAG, String msg);這裏的msg很多時候就是函數名,比如之前看到示例。於是新曾一個類:

publicclassLogInfo {

privatestaticfinalintLENGTH= 5;


privatestaticfinalbooleanDEBUG=true;


enumInfoKind{

FILE_NAME,

METHOD_NAME,

CLASS_NAME,

LINE_NUM

}


publicstaticString getFileName() {

returngetInfo(InfoKind.FILE_NAME);

}


publicstaticString getMethodName() {

returngetInfo(InfoKind.METHOD_NAME);

}


publicstaticString getClassName() {

returngetInfo(InfoKind.CLASS_NAME);

}

publicstatic String getLineNumber() {

returngetInfo(InfoKind.LINE_NUM);

}


private static String getInfo(InfoKind kind) {

String ret ="";

if(!DEBUG){

return ret;

}

StackTraceElement[]stackTraceElements = Thread.currentThread().getStackTrace();

if(stackTraceElements !=null && stackTraceElements.length>=LENGTH){

StackTraceElementstackTraceElement = stackTraceElements[LENGTH- 1];

switch(kind) {

caseFILE_NAME:

ret= stackTraceElement.getFileName();

break;

caseMETHOD_NAME:

ret= stackTraceElement.getMethodName();

break;

caseCLASS_NAME:

ret= stackTraceElement.getClassName();

break;

caseLINE_NUM:

ret= Integer.toString(stackTraceElement.getLineNumber());

break;


default:

break;

}

}

returnret;

}

staticStackTraceElement getInfoInternal(intlength) {

StackTraceElementret =null;

if(!DEBUG){

returnret;

}

StackTraceElement[]stackTraceElements = Thread.currentThread().getStackTrace();

if(stackTraceElements !=null&& stackTraceElements.length>= length) {

ret= stackTraceElements[length - 1];

}

returnret;

}

}

MLog增加新方法

publicstaticintprintMethodName(String TAG) {

if(!LOG_OUT){

return-1;

}

Stringmsg ="";

StackTraceElementinfo = LogInfo.getInfoInternal(LENGTH);

if(info !=null){

msg= info.getMethodName() +" # Line "+ info.getLineNumber();

}

return Log.i(TAG,msg);


}



這樣代碼就改爲了

@Override

protectedvoidonStart() {

MLog.printMethodName(TAG);

super.onStart();

}

@Override

protectedvoidonResume() {

MLog.printMethodName(TAG);

super.onResume();

}

@Override

protectedvoidonStop() {

MLog.printMethodName(TAG);

super.onStop();

}


跟蹤代碼有時候還需要打印出棧,爲了使用方便,在類MLog中封裝方法

publicstaticintprintStackTrace(String TAG) {

if(!LOG_OUT){

return-1;

}


StackTraceElement[]stackTraceElements =newException().getStackTrace();

if(stackTraceElements !=null){

Log.d(TAG,"printStackTrace:");

for(int i = 1; i < stackTraceElements.length;i++) {

Log.d(TAG,stackTraceElements[i].toString());

}

}

return 0;

}



以上就是我對log使用的一點心得,附上這兩個類文件

http://download.csdn.net/detail/jypeitao/4999245




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章