| J2ME学习日记之利用定时器类模拟MIDlet外部事件 |
|
|
|
|
Author: 一滴蔚蓝色 | Date: 2007-08-07 | View: 1615
|
开发技术 -
新手上路
| ||||
|
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDlet; 通过上面程序可以看到, Timer必须配合TimerTask才能实现定时器功能。TimerTask是一个抽象类 ,必须有子类继承它并重载其run()方法。Timer实例一个对象timer,该对象通过调用schedule方法调度TimerTask子类对象执行其run()方法,从而达到使MIDlet 周期性的在暂停状态和活动状态之间不停的切换。 MyTimerTask类其实很简单,该类内部定义了一个私有数据 MIDlet 对象,通过它可以调用resumeRequest()方法使MIDlet 程序请求从暂停恢复到活动状态。 MidletTest 类中实现了CommandListener接口,所以必须要重载其对应的commandAction(Command c, Displayable d)方法。使程序能够对用户的操作做出响应。类似的在AWT中我们见多了。我们可以执行"EXIT",使程序主动进入销毁状态。具体可以观察控制台信息: MidletTest Constructor startApp Called Ready to paused MyTimerTask contructor pauseApp Called run() called startApp Called destroyApp Called:false Ready to paused MyTimerTask contructor 便于理解,可以假设有如下场景: 上班时间,老板不在,用手机玩会游戏先!游戏ing…… 有电话!接个电话先,over! 继续游戏! 不好 b老板来了,"EXIT" 退出游戏!! 可以看到程序不停的在活动和暂停状态之间切换。当我们"EXIT"程序时 ,看到控制台打印信息 , 传入destroyApp 的是false,即非强制性销毁。前面已经了解,MIDlet主动请求状态转换需要调用的方法,并且一般都要先调用相应的pauseApp() destroyApp()方法。这里不在多说。现在关心的是:具体怎么通过Timer 和TimerTask 实现的呢?仔细观察程序,有这两句: mtk = new MyTimerTask(this); 首先实例MyTimerTask对象,并将this作为参数传递给构造方法。this指向的是当前Midlet。观察其构造方法,参数类型是MIDlet ,而MidletTest 只是其导出类。这里隐藏了向上转型。(具体可以参考j2se中继承与多态部分。)获得了MIDlet的引用 ,就象手里拿着遥控器一样 ,timer就可以控制MIDlet了。timer通过schedule方法设置周期,执行该任务 等待两秒。接下来的两句 ,就是程序主动请求进入暂停。另外,还注意到 timer 在构造方法中,所以只被调用一次,而mtk却每次调用startApp时都会被重新new一次。这是因为只有调用cancel() Timer和TimerTask脱离关系时 ,TimerTask才能被安排其他任务。 如果把Thread.sleep(4000); 这个try{}catch(){}块注释掉,我们发现 MIDlet从暂停进入活动状态后 屏幕只是很快的一闪 就又进入暂停状态了。所以这段代码 就是让活动状态多停留一会 让他sleep 4秒。 再看看这段代码: try{现在把其中的try 和catch 注释掉 其他的保留。当再次运行程序,"EXIT",看看控制台打印的信息: MidletTest Constructor startApp Called destroyApp Called:false Ready to paused MyTimerTask contructor startApp threw an Exception java.lang.IllegalStateException: Timer already cancelled. 在startApp()中有异常被抛出。分析控制台信息,应该是发生在destroyApp已经被调用但notifyDestroyed()方法还没执行时。此时cancel()方法已经执行完毕,Timer和TimerTask 的合作关系也被迫解除。startApp()继续执行,当程序执行到 timer.schedule(mtk, 2000); 这句时 ,因为关系已经解除,startApp()无法继续, 所以抛出了上面的异常。 Timer类还有其他的方法,具体可以参考api中java.util包 本文关键字: J2ME 外部事件 阅读数: 1616 | 打印 | E-mail
|
||||||||
| 最近更新 ( 2007-08-07 ) | ||||||||
| (入门-J2ME学习日记之利用eclipse编写MIDlet) < 上一篇 | 下一篇 > (开发手机游戏的一点心得) |
|---|