Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переход с класса в класс, Display.setCurrent(***) 
:(
    Опции темы
Gameout
  Дата 3.4.2007, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 8.2.2007
Где: Интернет

Репутация: нет
Всего: нет



Добрый день! Поиогите пожалуйста с проблемой!!! 

Как правильно и правильно ли если есть в в Мидлете несколько класоов (отдельных файлов),
типа Каждый класс (extends Canvas) - это якобы окно приложения. Так вот при переходе с класса на класс (т.е. якобы смене окна) при определенных условиях, правильно ли делать типа Display.setCurrent(***)? для того чтобы у каждого окна было свое управление? Или нужно (можно) как то по другому? 

Я пока реализовываю свою идею таким способом, но возникает при этом проблема, так как в каждом классе у меня рисуеться новое окно, и пре переходе с класса на класс (смене окон) то хавает по 2 метра оперативы в телефоне!!! Уже пытался и так и сяк всеровно хавает, меньше но  хавает и в конце концов телефон с 16 метрами оперативы отдает все и виснит . Перед переходом на след. окно практически все приводил в null, вызывал сборщик мусора все ровно не помогает!!! Подскажите пожалуйста что делать?

PM MAIL   Вверх
Nemesis
Дата 3.4.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 20.2.2005
Где: Москва

Репутация: 3
Всего: 5



Привет!
Нет, это не правильно, поскольку ты сам заметил,что это съедает огромное количество ресурсов. Тебе не нужно иметь по классу на каждое окно. Тебе нужно просто самим это окно перерисовывать. 
Заводишь один класс extends Canvas и в нем производишь все отрисовки, просто в методе paint() вызываешь соответствующую функцию и передаешь в нее Graphics или как тебе там удобнее. 
--------------------
PM MAIL   Вверх
W0LF
Дата 3.4.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



 Смотря что ты пишешь.
Если игру, то там один GameScreen, но все экраны опций и настроек я например реализовывал в новом окне.
Если бизнес-приложение, то каждый вьювер - это отдельный класс.
Вот я например писал клиента для сайта знакомств(это было достаточно большое приложение и м), представляешь сколько там экранов? сводить это к процедурному программированию это рано или поздно зафакапить проект.
Тем более сейчас телефоны уже получше чем были ранее..
Вот в данный момент тож пишу так же.
Мое приложение работает нормально на Motorola c350, хотя это не настолько быстрый телефон. и памяти столько не кушает.
Может код покажешь как ты делаешь именно отрисовку экрана и эти переходы?



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Gameout
  Дата 5.4.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 8.2.2007
Где: Интернет

Репутация: нет
Всего: нет



Код мидлета такой:
Код


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Midlet extends MIDlet{
     
     private Display  display;
     private MyCanvas canvas;
     
     
     public Midlet(){
          display = Display.getDisplay( this );
          canvas  = new MyCanvas(this);
     }
     public void startApp() {
          display.setCurrent( canvas );
          
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
          destroyApp(true);
          notifyAll();
     }
}




При старте мидлета он переходит к классу MyCanvas и начинает там свою работу(Рисуеться меню).
Код MyCanvas:
Код

class MyCanvas extends Canvas {
     
     private MIDlet midlet = null;
     private Display disp = null;
     private ScoreMenu scoreMenu = null;
     private AboutMenu aMenu = null;
     Image img = null;
     InputStream is = null;
     int getKey;
     int indexOfMenu = 1;
     int bGlavMenu = 0;
     PMenu myMenu = null;
     
     public MyCanvas( MIDlet midlet ){
          this.midlet = midlet;
          this.setFullScreenMode(true);
          disp = Display.getDisplay(midlet);
          scoreMenu = new ScoreMenu(midlet);
          aMenu = new AboutMenu(midlet);
          myMenu = new PMenu();
          
     }

     protected void paint( Graphics g ){
                   
             myMenu.paint(g);
     }


В этом месте я создал класс для рисования меню:
myMenu.paint(g);
Потом класс PMenu
Код

private class PMenu{
          private void paint(Graphics gr) {

Тут добаляю картинки через InputStream
Код

 try{
                    is = getClass().getResourceAsStream("/images/Main.png");//Заглавие
                    gr.drawImage(img.createImage(is),XPositionMain,5,0);
                   
                    
                    is = getClass().getResourceAsStream("/images/menuNewGame.png");//Новая игра
                    gr.drawImage(img.createImage(is),XPositionMenu,134,0);
                  
                    
                    is = getClass().getResourceAsStream("/images/menuScore.png");//Счет
                    gr.drawImage(img.createImage(is),XPositionMenu,171,0);
                  
                    
                    is = getClass().getResourceAsStream("/images/menuHelp.png");//Помощь
                    gr.drawImage(img.createImage(is),XPositionMenu,208,0);
                  
                    
                    is = getClass().getResourceAsStream("/images/menuAbout.png");//Об игре
                    gr.drawImage(img.createImage(is),XPositionMenu,245,0);
                  
                    
                    is = getClass().getResourceAsStream("/images/menuExit.png");//Выход
                    gr.drawImage(img.createImage(is),XPositionMenu,282,0);
                  
                    is.close();
}catch(IOException ex){}


}}


Потом в классе делаю действие от нажатия типа определенного пункта меню
и перехожу допустим в другой класс(Окно Счет)
таким образом
Код

//действие от нажатия при определенном условии:
                         is = null;
                         img = null;
                         gr = null;
                         System.gc();
                         disp.setCurrent(scoreMenu);



Из меню "Cчет" тоже делаю выход, из этого окна назад в глав меню:
Код

if(getKeyNum == -7) {
               try {
            
                    is.close();
               } catch (IOException ex) {
                    ex.printStackTrace();
               }
               is = null;
               img = null;
               
               canvas = new MyCanvas(midlet);
               disp.setCurrent(canvas);
          }


Таким образом сделал и другие!!! 
И при заходе например в меню "Счет" затем сразу допустим вышел назад на глав меню. Зашел в меню "Об игре" и снова вышел назад и при этом оперативная память телефона просто исчезает когда зайдешь и выйдешь например таким образом.


PM MAIL   Вверх
Dancer
Дата 5.4.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



где -то в интерфейсном классе делаешь объявление своих констант
public static final int SCORE_MENU = 1;
.....


...
//действие от нажатия при определенном условии:
                         is = null;
                         img = null;
                         gr = null;
                         System.gc();
MyCanvas.paintWindow(SCORE_MENU);


class MyCanvas extends Canvas {
    private static int repaintID = -1;
.....
    public static void paintWindow(int windowRepaint) {
        //можно сделать какие нибудь проверки на валидность ещё
        repaintID = windowRepaint;
        repaint();
    }

    protected void paint(Graphics g) {
        switch(repainID) {
            case SCORE_MENU:
                scoreMenu.getInstance().paint(g);
             break;
        }
    }



ну или как-то так. Главное чтобы ты не гонял по 100 раз создание объектов и пихание их в Display.setCurrent() это у тебя и жрёт память.

Нужно тебе логику свою продумать до того, как начинаешь кодить. Ты пойми, от того как ты спроектируешь своё приложение так оно у тебя в дальнейшем и будет "жить" smile
Можешь кинуть весь проект в почту, будет время посмотрю и постараюсь ответить по-полнее, а так из того что ты тут привёл, инфы очень мало. Но дело точно в "голове" smile, не обижайся плиз.


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Gameout
  Дата 5.4.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 8.2.2007
Где: Интернет

Репутация: нет
Всего: нет



Спасибо!!! Как и куда скинуть? ? ?
PM MAIL   Вверх
hamsterKSU
Дата 5.4.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

Репутация: 7
Всего: 11



2Gameout что же ты бросил эту тему и начал новую,а нет вижу всетаки воспользовался указаниями smile я  говорил что надо просто следить за тем какое меню сейчас прорисовываешь и все это нормально ложится в одну канву

Добавлено через 7 минут и 26 секунд
я тебе уже писал - что ты рисуешь при каждой перерисовке в любом случае рисуешь свое первое меню с картинками а потом зарисовываешь его :( вот каждый раз и отжирается дофига памяти. а ты так и не исправил этого. прочитай мой пост в той теме повнимательнее
и послушай совета от Dancer, я это и имел ввиду, когда говорю что надо следить за тем что рисуешь сейчас и не рисовать лишнего
PM MAIL ICQ   Вверх
hamsterKSU
Дата 5.4.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

Репутация: 7
Всего: 11



заглянь сюда и тут почитай, если еше не читал
PM MAIL ICQ   Вверх
Dancer
Дата 6.4.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



Цитата(Gameout @  5.4.2007,  19:15 Найти цитируемый пост)
Спасибо!!! Как и куда скинуть? ? ? 

у каждого форумчанина есть PM, так же если залезть в профиль, то оттуда можно получить "КУДА" smile.
И посмотри линки которые дал hamsterKSU, для "начинающих" - полезно.


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
hamsterKSU
Дата 6.4.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

Репутация: 7
Всего: 11



Цитата(hamsterKSU @  5.4.2007,  20:08 Найти цитируемый пост)
заглянь сюда и тут почитай, если еше не читал 

сори немного не туда запостил, но для любого начинающего советуют люди
PM MAIL ICQ   Вверх
darf
Дата 6.4.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.4.2007

Репутация: 1
Всего: 1



Если хотите научиться быстро и качественно писать программы на J2ME, есть такая книжка
"Программирование игр для сотовых телефонов на J2ME (+CD)"
http://www.piter.com/book/978591180327
Автор - я. Рекомендую smile
Там рассказывается как сдлелать даже такую мегаигру, как Heroes Of Might and Magic.
Или, скажем, отправлять из мидлета SMS вне зависимости от того, какое API для этого поддерживает телефон (ОДНА единственная версия программы, работающая на всех аппаратах). И еще много чего полезного.
PM MAIL   Вверх
javastic
Дата 6.4.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



darf, Любавин С. А.?  smile 

Добро пожаловать к нам на форум!  smile 

Автографы раздаёте?  smile 


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
darf
Дата 9.4.2007, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.4.2007

Репутация: 1
Всего: 1



Да, это я.
Автографы раздаю, но не на форуме smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.