blackberry平臺J2ME編程指南(七)

2.4 HelloWorld MIDlet

     這個 MIDlet 也會在 MIDP 設備的顯示屏上顯示 "Hello World!" Exit 按鈕,按下該按鈕會終止應用程序。
      HelloWorld.java 文件以下面的代碼行開始,這些代碼行導入稍後會在 HelloWorld 類中使用的類:
      import javax.microedition.midlet.MIDlet;
      import javax.microedition.lcdui.Command;
      import javax.microedition.lcdui.CommandListener;
      import javax.microedition.lcdui.Display;
      import javax.microedition.lcdui.Displayable;
      import javax.microedition.lcdui.Form;
      由於 HelloWorld 類是一個 MIDP 應用程序,它擴展了 MIDlet。它也實現 CommandListener 接口來處理事件:

      public class HelloWorld extends MIDlet implements CommandListener
      下面的方法是一個缺省構造程序,它創建一個新表單,在上面初始化控件,然後顯示出來:

private Form form;

 public HelloWorld() {

    // Create a new form on which to display our text

    form = new Form("Test App");

 

    // Add the text "Hello World!" to the form

    form.append("Hello World!");

 

    // Add a command button labeled "Exit"

    form.addCommand(new Command("Exit", Command.EXIT, 1));

 

    // Register this object as a commandListener

    form.setCommandListener(this);

}


      調用 startApp() 方法啓動應用程序與小應用程序的啓動方法很象。在 MIDle 的一次執行中它可能會被調用多次。如果 MIDlet 暫停,pauseApp() 將會被調用。要重新啓動 MIDlet,需調用 startApp()。僅須執行一次的主初始化代碼應該放置在構造程序中:

      public void startApp()
      {
            // Get a reference to the display, and show the form
            Display display = Display.getDisplay(this);
            display.setCurrent( form );
      }
      pauseApp() 被調用使得 MIDlet 處於暫停狀態。在此應用程序中,當進入暫停狀態時,我們沒執行任何操作;但是我們仍然需要在 MIDlet 中實現 pauseApp 方法,因爲它是父 MIDlet 類中的抽象方法。
      public void pauseApp() { }
      destroyApp() 被調用,破壞了 MIDlet 並使其處於銷燬狀態。在此應用程序中,我們通過將引用設爲 null,釋放了對錶單的引用。
      public void destroyApp(boolean unconditional)
      {
            form = null;
      }
      commandAction() 方法是事件處理程序,被請求實現 CommandListener 接口。目前,它破壞了應用程序並通知應用程序管理軟件 MIDlet 已經完成。

      public void commandAction(Command c, Displayable d)
      {
            // Destroy this MIDlet
            destroyApp(true);

            // Notify the application management software that this MIDlet
            // has entered the destroyed state
            notifyDestroyed();
      }  

2.5 MIDP 軟件包

      除標準 CLDC 軟件包之外,MIDP 還包含三個附加的軟件包:
      · javax.microedition.lcdui -- 定義用來控制 UI 的類。這個軟件包既包含高級 UI 類(例如 FormCommandDateField TextField 等),又包含低級 UI 類(允許用低級方式控制 UI)。

      · javax.microedition.midlet -- 包含 MIDP 主類中的一個,MIDlet 類,爲 MIDP 應用程序提供訪問關於其運行所在環境信息的權限。

      javax.microedition.rms -- 定義一個類的集合,這些類爲 MIDlet 提供了永久存儲並隨後重新得到數據的機制。

 

2 具體API集差異

在本章的第一部分,通過對J2MEcldc配置和mdlp簡表的介紹,我們已經瞭解了很多J2ME的編程和J2SE的差異。在這一部分,我們將通過對具體各種類型的API功能編程的不同,來比較和分析這兩種開發模式的差異。

2.1 In/Out

這裏是標準J2MEio規範

初看到J2ME的版本,也許你會覺得很意外,因爲比起J2SE的版本,IO的功能要弱化很多。

下面這張圖是標準J2SEIO框架,如果要查詢J2SE的具體的IO輸入輸出的類別,可以參考Sunjavadoc api文檔。

2.2 String操作

一般說來,J2MEJ2SEstring操作差別不大,但是正如前面第二章提到過的,JVMKVM的差異以及兩個平臺的API不同,有些時候有些很細微的差異,雖然兩個平臺都有StringStringbuffer的類別,但是stringsplit/replaceall方法,在J2ME中是不支持的。

所以在編制具體應用的時候,如果發現有些類別方法不工作,就需要考慮自己構造一個實現。

如下是J2SEAPI方法截圖:

這裏就是一個在J2ME中分割split方法的實現。

/**

  * 分割字符串,原理:檢測字符串中的分割字符串,然後取子串

  * @param original 需要分割的字符串

  * @paran regex    分割字符串

  * @return 分割後生成的字符串數組

  */

 private static String[] split(String original,String regex)

 {

  //取子串的起始位置

  int startIndex = 0;

  //將結果數據先放入Vector

  Vector v = new Vector();

  //返回的結果字符串數組

  String[] str = null;

 

  //存儲取子串時起始位置

  int index = 0;

  //獲得匹配子串的位置

  startIndex = original.indexOf(regex);

 

  //System.out.println("0" + startIndex);

 

  //如果起始字符串的位置小於字符串的長度,則證明沒有取到字符串末尾。

  //-1代表取到了末尾

  while(startIndex < original.length() && startIndex != -1)

  {

   String temp = original.substring(index,startIndex);

  

   System.out.println("     "  + startIndex);

  

   //取子串

   v.addElement(temp);

            //設置取子串的起始位置

   index = startIndex + regex.length();

   //獲得匹配子串的位置

   startIndex = original.indexOf(regex,startIndex + regex.length());

  }

  //取結束的子串

  v.addElement(original.substring(index + 1 - regex.length()));

 

  //Vector對象轉換成數組

  str = new String[v.size()];

  for(int i=0;i<v.size();i++)

  {

   str[i] = (String)v.elementAt(i);

  }

  //返回生成的數組

  return str;

 }

2.4 File I/O

J2MEFile操作作爲JSR75的一部分,被轉移到了javax.microedtion.io.file下面,如下圖所以。

 

 

不同於標準java中的io下大量的文件操作支持,J2ME中的文件操作主要是針對移動設備的具體需求

Javax.microedition.io.file —— 提供對本地文件系統的訪問功能


      ConnectionClosedException —— 當試圖對一個已經關閉的 FileConnection 對象進行操作時,會拋出此異常。
      FileConnection —— 這是一個很關鍵的類,基本上文件讀寫都是有該類完成。可以從字面上去理解它的意思。
      FileSystemEventHandler ——事件偵聽。
      FileSystemListener —— 用於監聽文件系統目錄狀態的變化,比如文件的刪除、新增,存儲卡的拔出和插入等。
      FileSystemRegistry —— 用於管理和跟蹤文件系統的監聽器,以及可以通過此類過去當前所有文件系統的根目錄。
      IllegalModeException —— 文件打開模式異常,當試圖寫入以只讀方式打開的文件時,會拋出該異常。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章