国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 11:59:51
字體:
來源:轉載
供稿:網友

  學習J2ME,首先要了解MIDlet的生命周期。本文主要是深入了解一下MIDlet的生命周期。
  
  首先在你運行一個程序的時候,JAM會調用該midlet的構造函數來生成midlet的對象,然后被JAM置于Paused狀態。一旦JAM認為這個midlet對象可以執行時,就會調用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();
  
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁强县| 腾冲县| 海口市| 宿迁市| 沭阳县| 扎囊县| 鹰潭市| 丁青县| 华池县| 尼玛县| 同心县| 灵石县| 尼木县| 疏附县| 金堂县| 南和县| 保亭| 内乡县| 定南县| 浦江县| 调兵山市| 乐平市| 米脂县| 凯里市| 卓资县| 鹤壁市| 佛山市| 顺义区| 枞阳县| 灵石县| 阳西县| 汕头市| 北川| 远安县| 图木舒克市| 阳谷县| 额济纳旗| 沙坪坝区| 阳泉市| 天柱县| 齐河县|