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