blackberry平台J2ME编程指南(七)

本文详细介绍了一个简单的MIDP应用程序——HelloWorldMIDlet的开发过程,包括关键类的导入、MIDlet生命周期方法的实现及文件I/O操作等内容,并对比了J2ME与J2SE在String操作和文件I/O等方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 —— 文件打开模式异常,当试图写入以只读方式打开的文件时,会抛出该异常。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值