服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

midlet生命周期的理解及游戏死机问题


  学习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();
  
  }

扫描关注微信公众号