Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для мобильных телефонов > JAVA Micro Edition > Программирование

Программирование Вопросы связанные с программированием в JAVA

Ответ
 
Опции темы
Старый 23.01.2014, 13:09   #1
Zorko
AnyKey`щик
 
Регистрация: 18.07.2012
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Проблемы с повторным запуском мидлета на эмуляторе WTK

На реальном железе проблем нет. Но вот на этом эмуле из WTK:

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

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

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

Спасибо!
(Offline)
 
Ответить с цитированием
Старый 24.01.2014, 14:02   #2
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,342
Написано 473 полезных сообщений
(для 852 пользователей)
Ответ: Проблемы с повторным запуском мидлета на эмуляторе 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();//говорим телефонному менеджеру приложений что пора убить мидлет
    }
(Offline)
 
Ответить с цитированием
Старый 29.01.2014, 20:56   #3
Zorko
AnyKey`щик
 
Регистрация: 18.07.2012
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Проблемы с повторным запуском мидлета на эмуляторе 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 вызывается лишь один раз.
(Offline)
 
Ответить с цитированием
Старый 30.01.2014, 03:09   #4
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,342
Написано 473 полезных сообщений
(для 852 пользователей)
Ответ: Проблемы с повторным запуском мидлета на эмуляторе WTK

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 03:09.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com