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

原创 2004年07月12日 15:09:00

关键字: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)中实现.
=======================================================================

MIDlet工作原理

题记 :  现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧!         ①: 所有Kjava必须会继承自jav...
  • xiangzhihong8
  • xiangzhihong8
  • 2016年06月03日 16:26
  • 811

System.getProperty(String key)和MIDlet.getAppProperty(String key)方法说明

system.getProperty(String key)标准的5个属性键列表如下:属性键值  描述  默认值  microedition.configuration  支持的configurati...
  • denlee
  • denlee
  • 2007年09月06日 14:12
  • 1509

别了j2me-->系统原理之MIDlet

题记 :  现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧!         ①: 所有Kjava必须会继承自java...
  • pdw_jsp
  • pdw_jsp
  • 2011年09月01日 23:50
  • 1640

MIDlet Code signing certificates证书申请流程

Sun Java 产品代码数字签名---申请产品代码数字签名认证证书 说明: 该“证书”是用来和Sun Java SDK的签署工具(或者用SUN WTK2.2—Ktoolbar工具—“文件”->“工具...
  • c30gcrk
  • c30gcrk
  • 2007年10月09日 10:08
  • 630

J2me MIDlet操作手机功能性用法总结(如调用其他程序或者调用其他MIDlet)

本技术文章,由www.j2megame.com原创, 转载请说明。 方法1:MIDlet 通过 platformRequest,调用手机本地应用程序。 示例:S60中调用platformRequest...
  • feikonl
  • feikonl
  • 2010年07月14日 11:01
  • 1848

MIDlet的生命周期

MIDlet的生命周期         当MIDlet被应用程序管理器成功地初始化之后,就开始展开了它的生命周期。MIDlet的生命周期完全由应用程序管理器控制,也就是说,当MIDlet要从一个状态变...
  • shiyuntian_wang
  • shiyuntian_wang
  • 2010年03月29日 11:28
  • 691

J2ME入门之HelloWorld

引言  前面几篇文章已经介绍了Eclipse及其工作环境的安装、配置过程,并完成各项相关准备工作。因此从本文开始将讲述如何使用前面配置好的Eclipse开发环境来创建J2ME项目,开始真正的J2ME开...
  • runner0592
  • runner0592
  • 2006年08月10日 23:35
  • 4108

MIDlet 应用程序的生命周期

(转自J2ME开发网的J2ME中文教程)理解J2ME 的体系结构并不像想象的那么容易,我们觉得读更多的资料帮助也不大,我们直接迈向J2ME 开发也许会对你理解J2ME 平台体系结构这个重要的概念有所帮...
  • wnfc0729
  • wnfc0729
  • 2006年04月20日 10:54
  • 786

MIDlet应用程序的生命周期

转1:除了由应用程序管理员来控制MIDlet的生命周期之外,MIDlet本身也可以决定自己的状态,但不是自己改变状态,而是MIDlet先呼叫上述相对应的状态改变函数。这些函数会发出讯息通知应用程序管理...
  • joziez
  • joziez
  • 2006年12月21日 15:38
  • 743

MIDlet生命周期

当一个MIDlet被成功初始化以后,它就有了生命周期。MIDlet的生命周期完全由应用程序管理器来控制,意思是当MIDlet从一种状态转换到另一种状态时,应用程序管理器都会调用相应的抽象方法。MIDl...
  • mmiww
  • mmiww
  • 2006年10月29日 02:57
  • 708
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:敲开MIDlet的脑壳----在MIDlet中另外运行的两个线程
举报原因:
原因补充:

(最多只允许输入30个字)