【问题标题】:Multiple instances of j2me midlet problemj2me midlet问题的多个实例
【发布时间】:2012-09-22 17:38:23
【问题描述】:

我有一个在手机上运行的 j2me midlet。代码运行良好,但出现的问题是程序似乎运行了多个自身实例。我在 appStart() 方法内的应用程序开头有代码,该方法在应用程序启动时运行两次。在程序的生命周期中,当文本写入屏幕时,可以看到代码运行了两次。

代码如下所示:

public MyClass()
{
    form = new Form("MyProgram");
    cmdClose = new Command("EXIT", Command.EXIT, 1);

    form.addCommand(cmdClose);
    form.setCommandListener(this);

    display = Display.getDisplay(this);
    display.setCurrent(form);
}

public void startApp()
{
    form.append("App starting\n");
    // Rest of program
}

我不知道为什么代码被调用了两次。

我正在 i290 上编码。

【问题讨论】:

    标签: java-me instance midp midlet lcdui


    【解决方案1】:

    这绝对是一个 JVM 错误。 startApp() 只能在启动时调用一次,并且在调用 pauseApp() 或您自己调用 notifyPaused() 之前不能再次调用。

    我建议的是以下代码:

    private boolean midletStarted = false;
    
    public void startApp() {
        if (!midletStarted) {
            midletStarted = true;
            //Your code
        }
    }
    

    这样您就可以跟踪 midlet 状态变化。但实际上最好不要使用这个方法,而是使用构造函数。

    哦,顺便说一句,我不认为有多个实例或类似的东西,这只是一个 JVM 错误。

    【讨论】:

    • 它不一定是 JVM 问题,因为 startApp() 可能会在各种情况下被调用,例如当手机屏幕变暗或由于将应用程序置于后台和前台的各种事件。但是,您给出的修复是正确的!
    • 如果将应用程序置于后台,则应首先调用 pauseApp()。在这种情况下,该错误不会调用 pauseApp() 方法,但无论如何它仍然是一个错误。
    • pauseApp() 不一定在所有实现中都被调用,而是使用了 showNotify 和 hideNotify。不过你的内涵是对的!
    • 一个“midletStarted”布尔值绝对是处理这个问题的正确方法,+1
    【解决方案2】:

    也许您做了一些事情,导致运行时调用 pauseApp(),然后当您将焦点设置到应用程序时,运行时再次调用 startApp()

    登录 pauseApp() 看看会发生什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多