程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME的重要功能簡介(2)

J2ME的重要功能簡介(2)

編輯:J2ME
AddressBookMIDLet類(見下)包含一個 AddressDB對象,一個 List GUI組件和一個 Back命令和 Exit命令。我們將使用 AddressDB類中的 addAddress()方法,把地址添加到數據庫中。在 startApp()方法中,使用調用 List.append()和 AddressDB.addAddress()方法來填充 List。這是在 commandAction()內部完成的,其結果就是創建一個新的文本框並且添加顯示出來。因為 cmdBack命令對象是使用 Command.BACK變量創建的,當又一個元素被添加顯示時,環境知道顯示一個 Back命令按鈕。然後通過把顯示焦點設置回 mnuMain列表對象,處理 “back”命令事件。

import javax.microedition.midlet.*;import Javax.microedition.lcdui.*;
public class AddressBookMIDLet extends MIDlet implementsCommandListener {
Display display = null;
List mnuMain = null;
TextBox txtAddress = null;
static final Command cmdBack = new Command("Back", Command.BACK,0);
static final Command cmdExit = new Command("Exit", Command.STOP,3);
AddressDB dbAddress = null;
public AddressBookMIDLet()
{
dbAddress = new AddressDB();
file://杜撰的地址
dbAddress.addAddress("Bill Gates", "123 Elm Street");
dbAddress.addAddress("George Bush", "742 Avenue B");
dbAddress.addAddress("Yuki Aka", "853 Franklin Avenue");
dbAddress.addAddress("Oba Muchow", "101 Scenic Highway");
dbAddress.addAddress("Bill Clinton", "741 Highway 101");
}
public void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
mnuMain = new List("Addresses", Choice.IMPLICIT);
int count = dbAddress.recordCount();
for (int i=0; i < count; i++) {
mnuMain.append(dbAddress.getName(i+1), null);
}
mnuMain.addCommand(cmdExit);
mnuMain.setCommandListener(this);
display.setCurrent(mnuMain);
}
public void pauseApp() {
display = null;
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
public void commandAction(Command c, Displayable d) {
String str = c.getLabel();
if (str.equals("Exit")) {
destroyApp(true);
}
else if (str.equals("Back")) {
display.setCurrent(mnuMain);
}
else {
List select = (List)display.getCurrent();
String txtSelect =
AddressDB.getName(select.getSelectedIndex() + 1) + ", " +
dbAddress.getAddress(select.getSelectedIndex() + 1);
txtAddress = new TextBox("Address", txtSelect, 255,
TextFIEld.ANY);
txtAddress.addCommand(cmdBack);
txtAddress.setCommandListener(this);
display.setCurrent(txtAddress);
}
}
}

四、小結

在本例子中,示范如何使用 J2ME記錄管理系統(RMS)構造一個基本的通訊錄應用程序,支持局部數據存儲的能力是 J2ME與其他無線技術比如 WML/WMLScript的不同之處,當然,要使來自移動設備的數據與一個企業數據庫同步需要附加的網絡和輸入/輸出性能,下面我想談談J2ME網絡功能。

J2ME網絡程序設計

前面我介紹了通過記錄管理系統 ( RMS )開發本地設備數據存儲,J2ME另外一個很重要的特性就是使用 J2ME連接結構打開網絡連接並傳送數據的能力。Javax.microedition.io包內的這個結構包括 Connection類和好幾個很有用的接口 (包括 StreamConnection、 ContentConnection和 HTTPConnection )。本文討論這個包的設計並使用 StreamConnection和 ContentConnection接口增強前面介紹的 AddressBookMIDLet例子的功能。

一、Javax.microedition.io程序包

如果你有使用 J2SE Java.Net包開發程序的經驗,你就會知道它使用的非常廣泛並且提供一些非常高級的網絡性能。遺憾的是,由於設備內存的大小,這些高級特性就不適合有限連接設備配置 CLDC。作為彌補,我們有一個簡化的但是功能完全的連接結構,允許傳送數據的簡單的連接。MID簡表有進了一步,它還定義了一個 HTTPConnection接口,用於網絡上的 HTTP訪問。

二、修改AddressBookMIDLet

本節中的例程與上一節中記錄管理系統 AddressBook例程幾乎一樣,上一節的例子使用的是本地的數據文件,而現在我要介紹的例子使用 J2ME網絡功能從一個儲存在互聯網上的文本文件中取回地址。這個文本文件名為 addressbook.txt,文件中的姓名與地址使用逗號分隔。我前面曾提到,下列例子使用兩個不同的 J2ME接口來執行傳送數據: StreamConnection和 ContentConnection。

三、使用StreamConnection存取數據

StreamConnection接口定義了一個流連接必須有的最小的功能。現在我們對AddressBookMIDLet應用程序做出修改:

刪除 AddressBookMIDLet()構造程序中的 dbAddress.addAddress()方法調用,這個方法調用可以刪除,因為新的程序沒有必要自己動手向數據庫中添加數據,新的程序將使用 J2ME的網絡功能取回儲存在網上的地址。

把特定的連接代碼添加到 AddressDB構造程序中。這兩個例子中的特定連接代碼只是簡單地通過 TCP/IP取回地址並手動地把每個地址添加到通訊簿中。

StreamConnection connStream = null;InputStream inStream = null;
byte[] b = new byte[255];
String address, name;
int commalocation = 0;
try {
connStream = (StreamConnection)
Connector.open("http://localhost/addressbook.txt");
inStream = connStream.openInputStream();
int count = inStream.read(b);
address = new String(b);
address = address.trim();
StringTokenizer st = new StringTokenizer(address, "");
while (st.hasMoreTokens()) {
address = st.nextToken();
commalocation = address.indexOf(',');
name = address.substring(0, commalocation);
address = address.substring(commalocation + 1);
addAddress(name, address);
}
}
catch (IOException e) {
System.out.println(e);
e.printStackTrace();
}

上面的代碼能夠工作,但是有點小問題。必須限定字節數組長度為255,因為 StreamConnection接口不能估計下載數據的大小。為此,我可以利用 ContentConnection接口以及很好使用的getLength()方法。

另外一個問題就是 J2ME中缺少 J2SE的 Java.util.StringTokenizer類。雖然可以自己寫字符串分析器類,但是也可以從網上找到StringTokenizer類。

四、使用ContentConnection存取數據

ContentConnection接口與StreamConnection接口作用差不多,但是它提供了更多有用的方法。ContentConnection接口與 StreamConnection接口作用差不多,但是它提供了更多有用的方法。其中有一個非常有用的方法 getLength(),它返回內容的長度,為了使用這個方法,需要聲明一個 ContentConnection變量:

ContentConnection connStream = null;


我將把字節數組移進 try{}子句中,並改變另外三項:

1. 把 Connector.open()方法的輸出結果強制轉化成一個 ContentConnection。
2. 取得 ContentConnection後,調用 c.getLength()來取回這個數據的長度。
3. 一旦取得內容的長度,就可以使用這個長度動態地創建一個字節數組。

除此之外,其他的部分與原來的程序相同。

ConnStream = (ContentConnection)
Connector.open("http://localhost/addressbook.txt");
int len = (int)connStream.getLength();
byte[] b = new byte[len];


五、小結

在 MID簡表中包含網絡功能是有前瞻性的,使 J2ME成為未來無線電應用開發的領導。這個功能將是人工智能技術的基礎,使J2ME成為未來技術的基石 (例如,你可以使用 HTTPConnection接口和 XML分析器構造一個 WML浏覽器)。事實上,象 kXML這樣的 XML分析器將允許 J2ME客戶端支持 SOAP、 XML-RPC和其他基於 XML的分布技術。

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