2

我有一个有一个静态变量的 midlet。我需要保留在此变量中创建的所有实例的记录。但它不像静态变量那样工作。我的代码段看起来像这样。我在 sun 无线工具包 2.5.5 上运行这个 midlet。我可以从该工具包中创建许多相同 midlet 的对象,但我的计数器仍然只显示 1。

public class SMS extends MIDlet implements CommandListener {

   private Display display;
   private TextField userID, password ;
   public static int counter ;

   public SMS() {

      userID = new TextField("LoginID:", "", 10, TextField.ANY);
      password = new TextField("Password:", "", 10, TextField.PASSWORD);
      counter++;

   }

 public void startApp() {

      display = Display.getDisplay(this);
      loginForm.append(userID);
      loginForm.append(password);
      loginForm.addCommand(cancel);
      loginForm.addCommand(login);
      loginForm.setCommandListener(this);
      display.setCurrent(loginForm);

  public void commandAction(Command c, Displayable d) {

     String label = c.getLabel();
     System.out.println("Total Instances"+counter);

每次,计数器只显示 1 个创建的对象。

4

2 回答 2

1

您的 MIDlet 只被实例化一次。有点儿。

MIDP 运行时可能不允许您启动相同的 MIDlet 两次,只要它已经在运行。

如果退出 MIDlet,计数器将返回 0,因为它仍然是 RAM 中的值,并且 Java 虚拟机进程终止。

在某些诺基亚 series40 手机上,JVM 进程永远不会终止,因此您可以使用它来显示自上次打开手机以来创建 MIDlet 的次数。

静态变量存储在 JVM 内存中的 Class 对象中。您需要了解类加载(以及 J2ME 中通常不支持类卸载)才能确定可以在静态变量中存储什么。

我建议移动counter++;startApp(),因为每次将 MIDlet 带到前台时都可以调用它。

这也将允许您将计数器存储在 RMS 记录中以提高准确性。

于 2009-08-28T14:04:13.287 回答
1

我见过的唯一允许静态变量在应用程序的“调用”之间保留的系统是 Android。我从未见过在 MIDlet 调用之间维护静态数据的 J2ME 设备。但是,MIDlet 套件中的 MIDlet 可以共享静态数据,如此处所述至少其中一个正在运行。

如果要在 MIDlet 的调用之间维护数据,则需要使用 javax.microedition.rms 中的记录存储 API,它提供对持久存储的访问。

于 2009-11-03T18:52:33.700 回答