Я прихожу в Java ME с фоном Java SE (который по сути не имеет опыта работы с GUI / ActionListener) и все еще немного дезориентирован отсутствием метода main (). Возможно, я должен сказать, что я изучил Java SE должным образом, но пытаюсь научить себя Java ME, прибегая к поиску большого количества страниц «Java ME для чайников», что не идеально. Я предполагал, что мне это сойдет с рук, но теперь я гораздо менее уверен.
Чтобы запустить скрипт Java ME, я пишу код для базового класса, но у меня нет статического метода main (). Вместо этого я заставляю класс расширять MIDlet, а затем пишу методы startApp (), pauseApp () и destroyApp (). Эти методы не выглядят статичными (в том смысле, что приложение «Здравствуй, мир», которое я здесь рассматриваю, не создает их как статические методы).
Первый вопрос: когда я запускаю свой мидлет, скажем, на моем телефоне, создается ли экземпляр базового класса в стеке?
После этого я еще больше растерялся. Предположительно, ответ на мой первый вопрос - да, и я могу назвать этот случай «этим». Теперь в 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.
}
Когда мидлет запускается, я подозреваю, что в стеке создается экземпляр TestMidlet. Затем запускается метод startApp (), который создает форму и отображает ее на экране. Теперь, на мой наивный взгляд, теперь произойдет следующее: в startApp () заканчиваются команды для выполнения, а затем он завершается.
Второй вопрос: прав ли я, предполагая, что (a) startApp () действительно завершается, но (b) экземпляр TestMidlet по какой-то причине не становится доступным для сборки мусора, потому что каким-то образом форма поддерживает его работу с помощью commandListener ? На данный момент мне неясно, есть ли в данный момент работающий стек. Предположительно, дело в том, что безымянный TestMidlet сам по себе является CommandListener и, следовательно, все еще занят, поэтому не хочет становиться доступным для сборки мусора, несмотря на то, что я не вижу ничего, ссылающегося на него.
Наконец, когда пользователь делает выбор в форме, этот безымянный экземпляр TestMidlet возвращается в действие в том смысле, что его метод commandAction () начинает работать? И, в частности, я все еще могу получить доступ к этому таинственному безымянному экземпляру TestMidlet в его методе commandAction, используя «this»?
Есть ли у меня все это прямо?