Java me 关于什么的基本查询';Java ME应用程序中的堆栈在进行什么
我是带着Java SE背景(基本上不涉及GUI/ActionListener体验)来到Java ME的,但由于缺少main()方法,我仍然有点迷失方向。也许我应该说,我正确地学习了JavaSE,但我试图通过谷歌搜索大量“JavaMeforDummies”页面来自学JavaMe,这并不理想。我原以为我会侥幸逃脱,但现在不太确定了 为了启动并运行JavaME脚本,我为基类编写代码,但没有静态main()方法。相反,我让类扩展MIDlet,然后编写startApp()、pauseApp()和destroyApp()方法。不过,这些方法看起来并不是静态的(我在这里看到的“hello World”应用程序并没有将它们创建为静态方法) 第一个问题是:当我开始在我的手机上运行MIDlet时,是否在堆栈上实际创建了基类的实例 在那之后,我更困惑了。我的第一个问题的答案大概是肯定的,我可以把这个例子称为“this”。现在在StartApp()中,我将创建一个表单并显示它。我的部分代码如下所示: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
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实例
这些都是直的吗
您可以将上述实例称为
this
startApp()
是根据考虑到您的JavaSE背景,我认为这听起来很熟悉。这里真的没有什么神奇之处——可以把它想象成在运行生命周期序列的过程中调用
startApp()
的某个框架,这对您来说是不可见的。如果您对更多细节感兴趣,请在web上搜索类似MIDlet生命周期的内容startApp
中的最后一句话中,此方法确实完成了-您就在这里。但更进一步说,并没有什么神奇的事情发生——TestMidlet实例是活动的,并且运行在“MIDP框架”下,直到用户停止应用程序或您的代码调用TestMidlet实例Object.finalize()
(请做好准备,MIDP缺少一些您在Java SE中习惯的其他方法和类)TestMidlet的“限定this”
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还有什么了
您遇到的一些困难来自这样一个事实:您的背景基本上不涉及GUI/ActionListener体验。准备好适应“UI风格思维”需要一些时间。如果您还没有阅读,请查看java.net
mainForm。只要您将mainForm定义为lcdui.Form,setSelectCommand
就不会编译-您的意思是在这个代码示例中mainForm.addCommand
?您可以看到我仍然是这个ME游戏的新手。我本想列个清单。我编辑了。我明白了——现在这更有意义了。顺便说一下,我在中更新了代码段,使用列表而不是表单