科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道J2ME的重要功能简介

J2ME的重要功能简介

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍J2ME的两个重要功能:持久数据和记录管理系统( Record Management System,简称 RMS)和J2ME网络程序设计

作者:郑伟 来源:yesky  2007年9月4日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

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的分布技术。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章