CSDN博客

img qlampskyface

敲开MIDlet的脑壳----在MIDlet中另外运行的两个线程

发表于2004/7/12 15:09:00  925人阅读

关键字:j2me  midlet 线程

和作者联系:xiaozuidaizhi@sina.com

================================================================================

先定义几个名词:
1.MyMIDlet    是继承了MIDlet的类(至于MyMIDlet是否实现其它接口,我们不去关心)
2.MyCanvas    是继承了Canvas的类(MyCanvas是否实现其它接口,我们也不去关心)
3.“进入”    表示跟进debug的路线
第一个“另外”:
        经过debug,我发现,在主线程中,一个midlet中最先被执行的代码是MyMIDlet类的对象的构造函数,而后进入了java.lang.Class类(public final)的runCustomCode()方法(static),而后再进入com.sun.midp.midlet.MIDletState类(public abstract)中未知方法(调试看不出来,如有人知道请告知),而后再进入com.sun.midp.midlet.Selector类(extends MIDlet implements CommandListener, Runnable)中,启动了run()方法,第一个“另外”诞生了。

第二个“另外”:
    接着上面继续debug:
    下来才是调用MyMIDlet类实例的startApp方法,执行Display.getDisplay(this).setCurrent(Displayable),由于setCurrent的参数是MyCanvas类的实例,所以,这一执行(指Display.getDisplay(this).setCurrent(Displayable))即调用(进入)了MyCanvas的paint()方法,所以,Display的成员方法setCurrent应该类似于下面的代码:


public void setCurrent(Displayable d){
  ... ...
  Graphics g = d.getGraphics();//生成Graphics实例
  d.paint(g);
  ... ...
}

在执行完paint方法之后,进入了Canvas类中的其它未知方法,而后再进入Display的未知方法,而后进入几个无关类之后就断掉了,原因无从查找,不过我们可以这样得到第二个另外:在模拟器单击开始,你会发现又能debug了,这时,当你执行完commandAction方法后,再debug几次,你就进入了这么一个类:com.sun.midp.lcdui.DefaultEventHandler(public & implements EventHandler),而后进入com.sun.midp.lcdui.AutomatedEventHandler(public & extends DefaultEventHandler implements AutomationHandler)类,这两个类成继承关系,而在DefaultEventHandler类中又有一个内部类VMEventHandler(implements Runnable)实现了run()方法,所以,第二个“另外”产生了:)

关于第一个“另外”:我认为这个线程是监听midlet状态的监听线程,叫状态监听线程

关于第二个“另外”:我认为是监听键盘输入的监听线程,叫键盘监听线程

这个线程类似于下面的代码:

private void run(Canvas canvas){
  while(true){
    int keyCode = getKeyPressed();//该方法是捕捉用户按键的底层方法
    if(keyCode>0){//判断是否有用户按键 
      keyDeal(canvas,keyCode);//调用下面的方法
    }
  }
}


private void keyDeal(Canvas canvas,int keyCode){
  canvas.keyPressed(keyCode);
}

所以,在一个midlet中,一般有下面这四个线程:

1.主线程

2.状态监听线程

3.键盘监听线程

4.自己实现的画动画的线程。

=======================================================================

        关于自己程序中画动画的线程(该线程中实现了对动画的repaint):
该线程在上述步骤中已经启动,启动的地方通常有两个,一处是在MIDlet对象的构造过程中(如果有和该对象成聚合关系的其它对象,则也在这里初始化);另外一处则在startApp()方法中,在实现了Display.getDisplay(this).setCurrent(Displayable);语句之后。
=======================================================================
在上面的debug过程中,我使用的是sun自己的wtk2.1,别的api的debug过程可能不一样,但是这是大同小异的,你可以触类旁通。比如西门子的api中监听键盘线程在javax.microedition.lcdui.EventQueue(final & implements Runnable)中实现.
=======================================================================

0 0

相关博文

我的热门文章

img
取 消
img