经过这几天的观察,我觉得一个midlet里应该有如下这么几个线程,它和application是不一样的

qlampskyface 2004-07-08 08:57:15
经过这几天的观察,我觉得一个midlet里应该有如下这么几个线程:

1.自己实现Runnable的线程
2.键盘监听线程-不知道这个线程从哪里来的,但是只要有键盘输入,就会马上有反应
3.repaint里的线程-repaint里的线程是靠自己实现的线程激发的,但激发后,它有自己的运行频率

总之midlet和application是不一样的,尤其是midlet的生命状态的控制和repaint这两方面,所以,以前只写过application,没有接触过动画编程的朋友领会起来比较吃力。

不知道我说的对不对,请指教
...全文
185 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qlampskyface 2004-07-14
  • 打赏
  • 举报
回复
顶一哈
海盗2019 2004-07-12
  • 打赏
  • 举报
回复
----------
没有接触过动画编程的朋友领会起来比较吃力。
----------
……:(
qlampskyface 2004-07-12
  • 打赏
  • 举报
回复
JAM中一定有类似以下的一段代码,当用户有键盘输入时调用

==================================================
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);
}
qlampskyface 2004-07-12
  • 打赏
  • 举报
回复
to happyegg(想转型的程序员):

你是说在j2me中没有键盘监听线程吗?

键盘监听是主线程来做?比如说,我按了UP,游戏就有了反应,这难道不是一个监听线程在做

吗?虽然Canvas中有keyPressed方法,让你实现当用户按下键来后剩下的部分,但是却没有去

调用这个keyPressed方法,所以说,这个方法一定是在JAM中被调用
happyegg 2004-07-12
  • 打赏
  • 举报
回复
我下载过几个手机游戏源码,里面似乎只有一个主进程,没有线程。通过sleep很小的一段时间来刷新并且监听键盘输入。我想,作为手机游戏,按键输入反应要求没有象键盘那么高,所以游戏的设计就没有那么复杂了。
qlampskyface 2004-07-12
  • 打赏
  • 举报
回复
顶一哈
qlampskyface 2004-07-12
  • 打赏
  • 举报
回复
上面的方法中应用了多态!
======================================================
JAMS应该还有一个机制来监听midlet的状态的转变,当你调用

destroyApp(false);noticeDestroyed();时,这个机制就将当前状态转变为销毁态,当你调用

pauseApp();noticePause();时,这个机制就将当前状态转变为暂停态。notice方法正是这个机制和midlet的通信接口!
======================================================
所以说,midlet不是一个严格意义上完整的程序,它的很大一部分都由JAMS来做了。
======================================================
我再对我发的楼顶帖作以修改:
标题:敲开MIDlet的脑壳----在MIDlet中另外运行的两个线程
先定义几个名词:
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状态的监听线程,叫状态监听线程

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

所以,在一个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)中实现.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧