敲开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)中实现.
=======================================================================

Android studio导入另外一个项目作为Library后出现两个启动项目等各类问题

首先说正确的 导入Library的方式: 1.启动AndroidStudio后,打开你需要接收Library的项目。比如有两个项目,项目A,和Library项目B,那么打开项目A。 2.在下拉菜单...
  • gfg156196
  • gfg156196
  • 2016年11月28日 11:20
  • 1733

用VS2010编写的C++程序,在其他电脑上无法运行的问题

本文介绍了几种解决VS2010缺失dll的问题。
  • shufac
  • shufac
  • 2016年07月18日 18:44
  • 4180

一道面试题 设计4个线程,其中两个每次对j增加1,另外两个对j每次减少1。循环100次。

题目 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。循环100次。写出程序。 解法1书上的答案是用内部类实现的,网上的答案基本都是照抄书上的。感觉不是很优雅,想自己实现以下...
  • never_cxb
  • never_cxb
  • 2015年12月22日 12:11
  • 2390

jbuilder2006中 运行 j2me (MIDlet).doc

  • 2010年02月10日 16:41
  • 270KB
  • 下载

写的第一个MIDlet程序:List类的应用

现在各种手机操作系统炙手可热,而针对不同手机操作系统的软件开发,也各不相同,J2ME也许落后了,没有android的那么绚丽,但是对我来说J2ME还是个没有涉足过的领域,而且可以编写自己想要的手机软件...
  • hackerain
  • hackerain
  • 2011年03月26日 17:06
  • 570

把JAR文件添加到MIDlet套件

本文档说明了如何把一个外部JAR文件添加到MIDlet套件项目中。 JAR文件类型添加硬件相关JAR文件添加应用相关JAR文件模拟器说明 JAR文件类型 从一个J2ME项目的观点来看,有...
  • yydcj
  • yydcj
  • 2013年01月10日 12:40
  • 505

J2ME MIDlet开发人员的第一个BlackBerry应用

对于任何开发来说,一个helloworld的介绍是必不可少的。对于移动应用开发来说,J2ME也是一种被广泛接受的平台技术,首先,我们用一个BlackBerry上的J2ME开发的HelloWorld为例...
  • needle2
  • needle2
  • 2011年01月06日 16:33
  • 618

MIDP 2.0安全机制 与 MIDlet 数字签名

原文链接:http://www.j2medev.com/bbs/dispbbs.asp =======================================================...
  • SCHOLAR_II
  • SCHOLAR_II
  • 2011年09月06日 17:47
  • 424

servlet+midlet的应用,请ME的高人给个问题解决思路

在做个小应用,就是一个移动交通查询系统,客户端(以火车车次查询为例)向服务器端servlet发送查询数据,servlet调用dao类访问数据库得到查询结果并返回给客户端,如图所示,客户端查询车次为“D...
  • zhiyu6491
  • zhiyu6491
  • 2017年01月03日 06:07
  • 63

技术相关 | J2ME-MIDlet和Android-Activity生命周期的比较

之前在网上看到问题,移动互联联网开发是用J2ME比较好还是用Android比较好,亦有问题问Android是不是J2ME的一种。就从字面概念理解,Android 是手机操作系统,J2ME是java语言...
  • baidu_34337873
  • baidu_34337873
  • 2017年06月25日 17:32
  • 63
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:敲开MIDlet的脑壳----在MIDlet中另外运行的两个线程
举报原因:
原因补充:

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