资源大全 | 神秘文化 | 在线翻译 | QQ专区 | 视频教程 | 彩信频道 | 搜索引擎 | BT下载 |  | 网站地图
设为首页
加入收藏
联系站长
您现在的位置: 一百网络 >> JSP编程 >> J2ME >> 文档正文
最近更新
普通文档 移动开发:J2ME中定点库
普通文档 MIDlet生命周期的深入理
普通文档 移动开发:RMS概念解析与
普通文档 在基于MIDP的应用程序上
普通文档 教您如何在MIDP开发中实
普通文档 开发经验谈:贪吃蛇游戏
普通文档 J2ME学习系列之如何将J2
普通文档 教您如何解决J2ME开发中
普通文档 用实例讲解一个定制计数
普通文档 熟练使用J2ME在实际开发
推荐文章
  • 此栏目下没有推荐文档
  • MIDlet生命周期的深入理解及游戏死机问题

    文章作者:佚名 录入时间:2006-7-5 来源:不详
    网站声明:本站的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出处和原始作者,文章版权归本网站与文章作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。


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

  • 上一篇文档:

  • 下一篇文档:
  •     查找更多“MIDlet生命周期的深入理解及游戏死机问题”的内容  
    相关连接
  • 移动开发:J2ME中定点库MathFP使用入门

  • 移动开发:RMS概念解析与使用指南

  • 在基于MIDP的应用程序上使用JDBC

  • 教您如何在MIDP开发中实现图片放缩

  • 开发经验谈:贪吃蛇游戏的MIDP实现核心