forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Проблемы с повторным запуском мидлета на эмуляторе WTK (http://forum.boolean.name/showthread.php?t=18879)

Zorko 23.01.2014 17:09

Проблемы с повторным запуском мидлета на эмуляторе WTK
 
На реальном железе проблем нет. Но вот на этом эмуле из WTK:

Цитата:

Version 2.5.2_01 for CLDC (04.12.2008 15:22) Developer Edition
Первый запуск мидлета: всё работает отлично. После выхода из мидлета и даже после аварийного выхода кнопкой "Положить трубку" эмулятор уже не запускает мидлет. Просто белый экран и всё. Я где-то конечно мог и ресурсы не до конца освободить, но не для мебели же там сборка мусора, блин.

Советы выкинуть эмуль WTK приветствуются. Только расскажите чем его лучше заменить. По идее, хороший девелоперский эмуль Java ME должен сам показывать такие вещи как утечка ресурсов, особенно критичная для повторной работы мидлета.

Могу не париться и забить, тем более что на реальных телефонах разных моделей проблем с повторным запуском нет. Если вас заинтересовала эта проблема и хочется докопаться до сути, то вот ссылка на сам мидлет.

Спасибо!

Жека 24.01.2014 18:02

Ответ: Проблемы с повторным запуском мидлета на эмуляторе WTK
 
Скорее всего проблема со сменой состояний мидлета:
startApp()
destroyApp(boolean unconditional)

Метод startApp() вызывается как при запуске приложения, так и при восстановлении из свёрнутого состояния (которое при сворачивании или входящем вызове, если телефон это поддерживает).

Мои методы выглядят всегда примерно так:
Код:

    public void startApp() {
        if(game == null) {
            game = new Main(this);
            game.start();
        }
        else {
            game.resume();
        }
    }

    public void pauseApp() {
        if(game != null)
            game.pause();
    }

    public void destroyApp(boolean unconditional) {
        game = null;
        notifyDestroyed();//говорим телефонному менеджеру приложений что пора убить мидлет
    }


Zorko 30.01.2014 00:56

Ответ: Проблемы с повторным запуском мидлета на эмуляторе WTK
 
Жека, подобный код есть и в моём мидлете.

Код:

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 вызывается лишь один раз.

Жека 30.01.2014 07:09

Ответ: Проблемы с повторным запуском мидлета на эмуляторе WTK
 
Понятно. В этом паскале есть метод типа notifyDestroyed(); который бы сообщал телефону о необходимости убить приложение? Реальные мобилки, я полагаю, сами вызывают его при отсутствии.
Работа с потоками - это отдельная тема. В телефонах тоже многопоточность бывает не ахти, наверное потому что слабенькие железки там. Например, в отдельном потоке грузишь что-то по http, и у тебя интерфейс тормозить начинает. Может это только с сетью связано, не тестировал.


Часовой пояс GMT +4, время: 17:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot