Жека, подобный код есть и в моём мидлете.
PROCEDURE (midlet: Midlet) startApp* ;
BEGIN
display := lcdui.Display.getDisplay(midlet);
IF midlet.screen = NIL THEN (* Если экран ещё не существует, создать его. *)
NEW(midlet.screen);
Width := midlet.screen.getWidth();
Height := midlet.screen.getHeight();
midlet.screen.img := lcdui.Image.createImage(Width, Height); (* Теневой экран. *)
midlet.screen.gra := midlet.screen.img.getGraphics();
display.setCurrent(midlet.screen);
ELSE (* Экран существует в памяти; просто перерисуем его. *)
midlet.screen.repaint;
midlet.screen.serviceRepaints;
END;
(* ВНИМАНИЕ! startApp должен выполниться максимально быстро, так как
эта процедура запускается во внутреннем управляющем потоке операционки,
некоторые девайсы даже лимитируют время вызова, например,
если 20 секунд будет висеть, то решат, что зависло, и убьют.
Именно с этой целью мы желаем перевести исполнение в другой поток. *)
(* Если поток существует, он продолжит свою работу; иначе создадим его. *)
IF ~midlet.threadStarted THEN
midlet.thread := lang.Thread.Init(midlet.screen);
midlet.thread.start; (* Запустим наследника Runnable.run в новом потоке. *)
midlet.threadStarted := TRUE;
END;
END startApp;
Проблема, с которой я столкнулся, не так уж тривиальна. На этом WTK'шном эмуле есть баги (или "особенности") либо с работой потоков, либо с перерисовкой экрана. Даже не знаю копаться ли в этом дальше, потому что как минимум на пяти разных моделях телефонов такой проблемы нет.
Да и пишу я на Компонентном Паскале, а не на Java. Так что исследования продолжаю. Пока что выяснил только то, что startApp вызывается лишь один раз.