程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> MIDlet的生命周期的深入理解及游戲死機問題

MIDlet的生命周期的深入理解及游戲死機問題

編輯:J2ME

學習J2ME,首先要了解MIDlet的生命周期。本文主要是深入了解一下MIDlet的生命周期。以上自己的個人心得,不對之處,希望大家多多指點。


    首先在你運行一個程序的時候,JAM會調用該midlet的構造函數來生成midlet的對象,然後被jam置於Paused狀態。一旦jam認為這個midlet對象可以執行時,jam就會調用startApp()方法,並將此midlet置於Active狀態。startApp()方法由於在系統來電、或者退回到系統菜單返回時會被再次調用,所以這裡只可以放初始化一次的代碼。或者你把初始化一次的代碼放到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();

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved