j2me log

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

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值