程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME的通用LOG框架

J2ME的通用LOG框架

編輯:J2ME

  在寫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模擬器中的截圖如下 :

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved