MIDlet生命周期的理解及游戲死機問題
2019-11-18 11:59:51
供稿:網友
學習J2ME,首先要了解MIDlet的生命周期。本文主要是深入了解一下MIDlet的生命周期。
首先在你運行一個程序的時候,JAM會調用該midlet的構造函數來生成midlet的對象,然后被JAM置于Paused狀態。一旦JAM認為這個midlet對象可以執行時,就會調用startApp()方法,并將此midlet置于Active狀態。startApp()方法由于在系統來電、或者退回到系統菜單返回時會被再次調用,所以這里只可以放初始化一次的代碼?;蛘吣惆殉跏蓟淮蔚拇a放到midlet的構造函數中。例如:
public class Midlet extends MIDlet{
Display display = null;
MyCanvas can;
public Midelt(){
display = Display.getDisplay(this);
can = new MyCanvas();
}
public void startApp(){
display.setCurrent(can);//假如把can = new
MyCanvas()放到這里,再來電返回時就會出問題。
}
}
或者
public class Midlet extends MIDlet{
Display display = null;
MyCanvas can;
public Midelt(){
}
public void startApp(){
if(display ==null){
display = Display.getDisplay(this);
can = new MyCanvas();
}//此處只會被運行1次,這樣就不會出錯
display.setCurrent(can);//這句按理放到這里最合適,你想顯示那個canvas就放哪個!
}
}
在startApp()中,你調用display.setCurrent(can)的時候,首先運行的是showNotify(),接著運行paint()函數一次,假如有線程的話,此時run()方法開始運行。一般在run()方法里一般這么寫。此時的run()是可以處理異步事件的,也就是你來電話的時候,這里run()還是運行的。不過他不會paint()什么東西,即使它里面有repaint(),這點放心。
public void run(){
while(flag){//flag是boolean型變量
try{
Thread.sleep(50);//時間自己設啦。
}catch(Exception e){}
repaint();
}
}
哇,來電話了,或者你退到系統菜單。如NOKIA s60的手機。
hideNotify()首先會被調用,接著pauseApp()再被調用。
這么快,打完了,返回時:先調用showNotify(),接著調用paint()函數一次,最后才是調用startApp()函數。
關于run()和paint()也可以使用display.callSerially(this)語句。這個以后有時間了再說。
明白了生命周期,再來看死機問題。我說的死機問題,多是來電話返回時死機。其實只要找到了問題,一切就變的很簡單。
為什么死機,歸根結底還是程序問題。
Graphics mg;//定義的全局參數
paint(Graphics g){
mg = g;//有的程序這樣寫,if(mg ==null){mg =g:}這樣對于n7610系列就會出錯。
mg.drawString();
switch(case){
case GAME_MUNE:
drawA();
break;
case PLAY:
drawB();
break;
default:
break;
}
}
/*下面的畫圖函數一定要放到paint()函數里調用,不要在別的地方調用,如run()里面,上面說過,程序暫停之后返回,會先paint()一次,假如在別的地方調用就會出現問題。
*/
public void drawA(){
mg.drawString();
}
public void drawB(){
mg.drawString();
}
按照上面的寫法一般不會出現死機問題。當然,你也可以不定義全局的mg,可以把g單獨傳到各個畫圖子函數中。如,
paint(Graphics g){
g.drawString();
switch(case){
case GAME_MUNE:
drawA(g);
break;
case PLAY:
drawB(g);
break;
default:
break;
}
}
public void drawA(Graphics mg){
mg.drawString();
}
public void drawB(Graphics mg){
mg.drawString();
}