Estou desenvolvendo uma aplicação em J2ME que por enquanto executa perfeitamente, desde de que seja a primeira vez que é Launch no emulador.
Se por algum motivo (clicar Exit por exemplo em uma de minhas Forms) a aplicação executar um notifyDestroyed e voltar a tela inicial do emulador e eu tentar executar de novo a aplicação, acontece um NullPointerException.
Minha dúvida é… o que acontece da segunda vez?
Quando acontece um notifyDestroyed a minha aplicação não “morre” no emulador?
E quando eu executo um Launch não há uma recriação de toda minha aplicação?
Já procurei em vários artigos sobre o ciclo de vida de MIDlet mas nao achei resposta para meu problema!
Estou desenvolvendo uma aplicação em J2ME que por enquanto executa perfeitamente, desde de que seja a primeira vez que é Launch no emulador.
Se por algum motivo (clicar Exit por exemplo em uma de minhas Forms) a aplicação executar um notifyDestroyed e voltar a tela inicial do emulador e eu tentar executar de novo a aplicação, acontece um NullPointerException.
Minha dúvida é… o que acontece da segunda vez?
Quando acontece um notifyDestroyed a minha aplicação não “morre” no emulador?
E quando eu executo um Launch não há uma recriação de toda minha aplicação?
Já procurei em vários artigos sobre o ciclo de vida de MIDlet mas nao achei resposta para meu problema!
Não posto o código pois ele é muito grande.
Desde já agradeço!
Na verdade o notifyDestroyed() remove a sua aplicação da memória, e o único jeito de reiniciá-la é com uma nova instância (new SuaClasse() [extends MIDlet])… entendeu?
P
PoneyMan
maruero:
Estou desenvolvendo uma aplicação em J2ME que por enquanto executa perfeitamente, desde de que seja a primeira vez que é Launch no emulador.
Se por algum motivo (clicar Exit por exemplo em uma de minhas Forms) a aplicação executar um notifyDestroyed e voltar a tela inicial do emulador e eu tentar executar de novo a aplicação, acontece um NullPointerException.
Minha dúvida é… o que acontece da segunda vez?
Quando acontece um notifyDestroyed a minha aplicação não “morre” no emulador?
Morre sim
Com certeza !
E eu acho q o problema está na lógica no início do ciclo de vida da tua aplicação.É algo nela que está gerando a exception, não o WTK…
maruero
Boone eu tbm acho que deveria ser minha lógica de inicialização, porém a minha aplicação nunca apresentou o mesmo erro na primeira inicialização, portanto deve haver alguma diferença na re-inicialização para que esse problema ocorra!
ok Fox McCloud, mas o comando “launch” do emulador nao instancia minha aplicação de novo?
É o que eu espero que ele faça! Mas não está parecendo que está instanciando necessáriamente da mesma forma!
Fox_McCloud
maruero:
Boone eu tbm acho que deveria ser minha lógica de inicialização, porém a minha aplicação nunca apresentou o mesmo erro na primeira inicialização, portanto deve haver alguma diferença na re-inicialização para que esse problema ocorra!
ok Fox McCloud, mas o comando "launch" do emulador nao instancia minha aplicação de novo?
É o que eu espero que ele faça! Mas não está parecendo que está instanciando necessáriamente da mesma forma!
Dê uma olhada no código desse MIDlet de um jogo que eu fiz, pode ajudar a esclarecer alguma coisa...
packagecontrole;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;/** * MIDlet, a classe principal que configura, inicia e termina o aplicativo * @author Cláudio Loureiro */publicclassTetrisextendsMIDlet{privateEngineengine;protectedvoiddestroyApp(booleanrestart)throwsMIDletStateChangeException{newThread(newRunnable(){publicvoidrun(){engine.stop();}}).start();if(restart)startApp();elsenotifyDestroyed();}protectedvoidpauseApp(){// TODO Auto-generated method stub}protectedvoidstartApp()throwsMIDletStateChangeException{engine=newEngine(this);newThread(engine).start();}publicvoidfinaliza(){try{destroyApp(false);}catch(MIDletStateChangeExceptione){}}publicvoidreinicia(){try{destroyApp(true);}catch(MIDletStateChangeExceptione){}}}
Não se preocupe com as Threads. Veja que quando eu chamo destroyApp(true), ou seja, restart = true, eu destruo a Thread do jogo e chamo startApp() novamente, reiniciando o programa, sem invocar notifyDestroyed(), então eu não mato a aplicação. Eu só invoco o notifyDestroyed() quando restart = false, que indica que a aplicação vai realmente fechar, sair da memória.