在寫J2ME程序的時候,我們一般都希望在真機運行的時候能有一些調試信息,一般在模擬器上運行的話,可以通過System.out.println來輸出一些信息,但是在真機上運行的話,就看不到了,因為手機沒有控制台啊.那時候如果想確認一些代碼的執行情況,經常會用Alert彈出對話框的形式來實現,但是它也有一個不好的地方,那就是當有多個Alert的時候,後面的Alert會把前面的Alert給覆蓋掉.後來想,能不能以日志的形式保存起來呢,然後再查看日志呢.參考了LWUIT的框架的LOG,好像它現在的源碼還下載不到,只是查看了它的API,覺得用一個管理類通過靜態方法統一來管理LOG是很好的一種方法,並且還支持自定義的LOG記錄器以及自定義的log顯示器.
代碼如下:
首先是Logger,它是一個接口,它提供了日志的記錄器所要做的一些事情.
/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
packagecom.hadeslee.insurance.mobile.log;
/**
*一個日志生成器要實現的接口
*@authorhadeslee
*/
publicinterfaceLogger{
publicstaticfinalintFINE=0;
publicstaticfinalintINFO=10;
publicstaticfinalintDEBUG=20;
publicstaticfinalintWARNING=30;
publicstaticfinalintERROR=40;
/**
*實現的log方法
*@paramlevel級別
*@paraminfo內容
*/
publicvoidlog(intlevel,Stringinfo);
/**
*得到所有的日志內容
*@return內容
*/
publicStringgetLogContent();
/**
*清除當前的日志
*/
publicvoidclearLog();
}
然後是日志顯示器,因為日志記錄了之後,肯定是要被我們顯示出來的,想要如何顯示,可以實現此接口.
/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
packagecom.hadeslee.insurance.mobile.log;
/**
*一個用於顯示日志的接口,此接口用於LogManager來調用
*@authorhadeslee
*/
publicinterfaceLogShower{
/**
*顯示日志,由LogManager調用此方法來顯示日志
*顯示日志可以有多種方法,比如可以用列表來顯示
*也可以用TextArea來顯示,還可以用Canvas來顯示
*@paramlogContent日志內容
*@paraMaction返回的時候要做的動作
*/
publicvoidshowLog(StringlogContent,BackActionaction);
/**
*內部的一個靜態接口,實現此接口以供LogShower在
*點擊了返回之後,要做的事情
*/
publicstaticinterfaceBackAction{
/**
*點擊返回之後要做的事情
*/
publicvoidback();
}
}
最後一個類就是LogManager,它只提供了靜態方法供調用,它內部有一個默認的Logger實現和一個默認的LogShower實現,在此類中的Shower實現可能不通過,因為我用到了LWUIT裡面的一些組件,這個可以自行修改,添加自己的默認實現.
/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
packagecom.hadeslee.insurance.mobile.log;
importcom.hadeslee.insurance.mobile.log.LogShower.BackAction;
importcom.hadeslee.insurance.mobile.util.Util;
importcom.sun.lwuit.Command;
importcom.sun.lwuit.Form;
importcom.sun.lwuit.TextArea;
importcom.sun.lwuit.events.ActionEvent;
importcom.sun.lwuit.layouts.BorderLayout;
/**
*日志管理器,所有的日志通過此日志管理器
*進行統一的調用
*此類相關的兩個接口都有相應的默認實現,當然
*也可以替換實現
*@authorhadeslee
*/
publicfinalclassLogManager{
privatestaticLoggerlog=newLoggerImpl();//具體的日志實現類
privatestaticLogShowershower=newLogShowerImpl();//日志顯示者
privateLogManager(){
}
/**
*安裝自己實現的日志記錄器
*@paramlog新的日志記錄器
*/
publicstaticvoidinstall(Loggerlog){
LogManager.log=log;
}
/**
*安裝自己實現的日志顯示器
*@paramshower新的日志顯示器
*/
publicstaticvoidinstall(LogShowershower){
LogManager.shower=shower;
}
/**
*記錄INFO級別的日志
*@paraminfo日志內容
*/
publicstaticvoidinfo(Stringinfo){
log.log(Logger.INFO,info);
}
/**
*記錄DEBUG級別的日志
*@paraminfo日志內容
*/
publicstaticvoiddebug(Stringinfo){
log.log(Logger.DEBUG,info);
}
/**
*記錄ERROR級別的日志
*@paraminfo日志內容
*/
publicstaticvoiderror(Stringinfo){
log.log(Logger.ERROR,info);
}
/**
*記錄WARNING級別的日志
*@paraminfo日志內容
*/
publicstaticvoidwarning(Stringinfo){
log.log(Logger.WARNING,info);
}
/**
*記錄FINE級別的日志
*@paraminfo日志的內容
*/
publicstaticvoidfine(Stringinfo){
log.log(Logger.FINE,info);
}
/**
*顯示當前日志管理器的日志
*@paramback要返回的時候,做的動作
*/
publicstaticvoidshowLog(BackActionback){
shower.showLog(log.getLogContent(),back);
}
/**
*清除當前日志管理器的日志
*/
publicstaticvoidclearLog(){
log.clearLog();
}
staticclassLogShowerImplimplementsLogShower{
publicvoidshowLog(StringlogContent,finalBackActionaction){
Formform=newForm("日志內容");
form.setScrollable(false);
finalTextAreata=newTextArea(logContent,5,10);
ta.setEditable(false);
form.addCommand(newCommand("返回"){
publicvoidactionPerformed(ActionEventae){
action.back();
}
});
form.addCommand(newCommand("清除"){
publicvoidactionPerformed(ActionEventae){
LogManager.clearLog();
ta.setText("");
}
});
form.setLayout(newBorderLayout());
form.addComponent(BorderLayout.CENTER,ta);
form.show();
}
}
staticclassLoggerImplimplementsLogger{
privateStringBuffersb;
publicLoggerImpl(){
sb=newStringBuffer(1024);
}
publicvoidlog(intlevel,Stringinfo){
sb.append(getPrefix()).append("n").
append(getLevelName(level)).append(":").
append(info).append("n");
}
privateStringgetPrefix(){
return"["+Thread.currentThread()+"-"+Util.getCurrentTime()+"]";
}
privateStringgetLevelName(intlevel){
switch(level){
caseFINE:
return"FINE";
caseINFO:
return"INFO";
caseDEBUG:
return"DEBUG";
caseWARNING:
return"WARNING";
caseERROR:
return"ERROR";
default:
return"UNKNOWN";
}
}
publicStringgetLogContent(){
returnsb.toString();
}
publicvoidclearLog(){
sb.delete(0,sb.length());
}
}
}
以上的默認實現中,日志是記錄在內存中的,可以用clearLog方法把它清除,當然,也可以自定久記錄在RMS裡面的日志,並且也要實現相關的clearLog的方法,添加這個方法是因為日志內容不可能讓它永遠無休止的增長.然後LogManager的showLog方法,就是利用LogShower的實現,把日志顯示出來,還有一點,顯示日志以後,為了能讓LogShower知道,如何返回上一個界面,這裡還應該實現一個BackAction方法.
經過自己這幾天的使用,發現挺好用的,所以特此和大家分享一下,以提高在開發JavaME的程序中的一些效率.
在WTK模擬器中的截圖如下 :