在写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模拟器中的截图如下 :