Java me 关于什么的基本查询';Java ME应用程序中的堆栈在进行什么

Java me 关于什么的基本查询';Java ME应用程序中的堆栈在进行什么,java-me,midp,lcdui,Java Me,Midp,Lcdui,我是带着Java SE背景(基本上不涉及GUI/ActionListener体验)来到Java ME的,但由于缺少main()方法,我仍然有点迷失方向。也许我应该说,我正确地学习了JavaSE,但我试图通过谷歌搜索大量“JavaMeforDummies”页面来自学JavaMe,这并不理想。我原以为我会侥幸逃脱,但现在不太确定了 为了启动并运行JavaME脚本,我为基类编写代码,但没有静态main()方法。相反,我让类扩展MIDlet,然后编写startApp()、pauseApp()和destr

我是带着Java SE背景(基本上不涉及GUI/ActionListener体验)来到Java ME的,但由于缺少main()方法,我仍然有点迷失方向。也许我应该说,我正确地学习了JavaSE,但我试图通过谷歌搜索大量“JavaMeforDummies”页面来自学JavaMe,这并不理想。我原以为我会侥幸逃脱,但现在不太确定了

为了启动并运行JavaME脚本,我为基类编写代码,但没有静态main()方法。相反,我让类扩展MIDlet,然后编写startApp()、pauseApp()和destroyApp()方法。不过,这些方法看起来并不是静态的(我在这里看到的“hello World”应用程序并没有将它们创建为静态方法)

第一个问题是:当我开始在我的手机上运行MIDlet时,是否在堆栈上实际创建了基类的实例

在那之后,我更困惑了。我的第一个问题的答案大概是肯定的,我可以把这个例子称为“this”。现在在StartApp()中,我将创建一个表单并显示它。我的部分代码如下所示:

public class TestMidlet extends MIDlet implements CommandListener {

    List mainForm;
    Command comSelect;

    protected void startApp() throws MIDletStateChangeException {

        mainForm = new List("Menu",List.IMPLICIT);

        mainForm.append("this one?",null);
        mainForm.append("or this one?",null);

        comSelect=new Command("Select",Command.ITEM,1);
        mainForm.setSelectCommand(comSelect);
        mainForm.setCommandListener(this);

        Display.getDisplay(this).setCurrent(mainForm);
    }

    public void commandAction(Command c,Displayable d) {
        // we will end up here when the user makes a selection in mainForm.
    }
启动MIDlet时,我怀疑堆栈上创建了TestMidlet的实例。然后运行startApp()方法,创建一个表单并将其显示在屏幕上。在我天真的眼中,接下来发生的事情是startApp()现在没有命令可执行,然后就完成了

第二个问题:我假设(a)startApp()确实完成了,但是(b)TestMidlet实例由于某种原因不能用于垃圾收集,因为表单通过commandListener使其保持活动状态,这对吗?在这一点上,我真的不清楚是否存在当前正在运行的堆栈。想必重点是,未命名的TestMidlet本身就是一个CommandListener,因此仍然很忙,所以不想成为垃圾收集的可用对象,尽管我看不到任何引用它的内容

最后,当用户在表单中做出选择时,TestMidlet的这个未命名实例会重新启动,因为它的commandAction()方法开始运行?特别是,我仍然可以使用“this”在commandAction方法中访问这个神秘的未命名的TestMidlet实例

这些都是直的吗

  • 当您开始在手机上运行MIDlet时,TestMidlet的实例将以与新对象()相同的方式创建。
    您可以将上述实例称为
    this

  • startApp()
    是根据
    考虑到您的JavaSE背景,我认为这听起来很熟悉。这里真的没有什么神奇之处——可以把它想象成在运行生命周期序列的过程中调用
    startApp()
    的某个框架,这对您来说是不可见的。如果您对更多细节感兴趣,请在web上搜索类似MIDlet生命周期的内容

  • startApp
    中的最后一句话中,此方法确实完成了-您就在这里。但更进一步说,并没有什么神奇的事情发生——TestMidlet实例是活动的,并且运行在“MIDP框架”下,直到用户停止应用程序或您的代码调用TestMidlet实例

  • 关于垃圾收集,您可以在这里安全地应用从Java SE获得的一般理解,保存缺少的方法
    Object.finalize()
    (请做好准备,MIDP缺少一些您在Java SE中习惯的其他方法和类)

  • TestMidlet的这个未命名实例重新启动,因为它的commandAction()方法开始运行-如果您正确设置了命令侦听器并添加了命令。特别是,您仍然可以在commandAction方法中访问这个神秘的未命名的TestMidlet实例,使用类似
    TestMidlet的“限定this”

  • 考虑到您对所有这些命令和侦听器的理解有多混乱,我建议您在实验代码中去掉implements CommandListener,具体如下:

    public class TestMidlet extends MIDlet {
    
        List mainForm;
        Command comSelect;
    
        protected void startApp() throws MIDletStateChangeException {
    
            mainForm = new List("Menu",List.IMPLICIT);
    
            mainForm.append("this one?",null);
            mainForm.append("or this one?",null);
            mainForm.append("Exit",null);
    
            comSelect=new Command("Select",Command.ITEM,1);
            mainForm.addCommand(comSelect); // note addCommand here
            mainForm.setSelectCommand(comSelect); // convenient thing BTW
    
            mainForm.setCommandListener(new CommandListener() {
                public void commandAction(Command c,Displayable d) {
                    // we'll end up here when the user makes a selection in mainForm.                   
                    List list = (List)d;
                    // note d refers to mainForm here, that's why it's OK to cast above
                    if (list.getString(list.getSelectedIndex()).equals("Exit")) {
                        // if user selected exit
                        TestMidlet.this.notifyDestroyed(); // exit the midlet
                    }
                }
            });
            // display the form
            Display.getDisplay(this).setCurrent(mainForm);
            // startApp finishes here
        }
    }
    

    这些都是直的吗

    不完全是。考虑到您的问题,您的“JavaMeforDummies”页面似乎已经过多,现在是时候切换到更严肃的资源了

    值得检查的是:

    • -SDN的教程
    • MIDP2()规范。获取PDF版本,跳过方法和类的详细信息,以便进行介绍性阅读
    • 这样你就知道除了MIDP还有什么了
    请记住,MIDP规范有一个更新的版本-,尽管我不建议您深入研究它,除非您明确地知道您的目标是这个版本


    您遇到的一些困难来自这样一个事实:您的背景基本上不涉及GUI/ActionListener体验。准备好适应“UI风格思维”需要一些时间。如果您还没有阅读,请查看java.net

    mainForm。只要您将mainForm定义为lcdui.Form,setSelectCommand
    就不会编译-您的意思是在这个代码示例中
    mainForm.addCommand
    ?您可以看到我仍然是这个ME游戏的新手。我本想列个清单。我编辑了。我明白了——现在这更有意义了。顺便说一下,我在中更新了代码段,使用列表而不是表单