Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Переход с класса в класс


Автор: Gameout 3.4.2007, 07:40
Добрый день! Поиогите пожалуйста с проблемой!!! 

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

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

Автор: Nemesis 3.4.2007, 11:24
Привет!
Нет, это не правильно, поскольку ты сам заметил,что это съедает огромное количество ресурсов. Тебе не нужно иметь по классу на каждое окно. Тебе нужно просто самим это окно перерисовывать. 
Заводишь один класс extends Canvas и в нем производишь все отрисовки, просто в методе paint() вызываешь соответствующую функцию и передаешь в нее Graphics или как тебе там удобнее. 

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

Автор: Gameout 5.4.2007, 18:04
Код мидлета такой:
Код


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);
          }


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


Автор: Dancer 5.4.2007, 18:56
где -то в интерфейсном классе делаешь объявление своих констант
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, не обижайся плиз.

Автор: Gameout 5.4.2007, 19:15
Спасибо!!! Как и куда скинуть? ? ?

Автор: hamsterKSU 5.4.2007, 20:49
2Gameout что же ты бросил http://forum.vingrad.ru/topic-143804.html# и начал новую,а нет вижу всетаки воспользовался указаниями smile я  говорил что надо просто следить за тем какое меню сейчас прорисовываешь и все это нормально ложится в одну канву

Добавлено через 7 минут и 26 секунд
я тебе уже писал - что ты рисуешь при каждой перерисовке в любом случае рисуешь свое первое меню с картинками а потом зарисовываешь его :( вот каждый раз и отжирается дофига памяти. а ты так и не исправил этого. прочитай мой пост в той теме повнимательнее
и послушай совета от Dancer, я это и имел ввиду, когда говорю что надо следить за тем что рисуешь сейчас и не рисовать лишнего

Автор: hamsterKSU 5.4.2007, 21:08
заглянь http://ruseti.ru/Java/Glava12/Index14.htm и http://ruseti.ru/Java/ почитай, если еше не читал

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

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

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

сори немного не туда запостил, но http://ruseti.ru/Java/

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

Автор: javastic 6.4.2007, 17:56
darf, Любавин С. А.?  smile 

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

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

Автор: darf 9.4.2007, 05:52
Да, это я.
Автографы раздаю, но не на форуме smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)