分享
 
 
 

入门-J2ME学习日记之-利用定时器类模拟MIDlet外部事件

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

入门-J2ME学习日记之-利用定时器类模拟MIDlet外部事件

作者:Snail

版权申明:可以转载,请保留作者信息和来源地址:

作者:Snail

地址:http://www.matrix.org.cn/resource/article/43/43851_J2ME.Html

前面提到MIDlet程序本身可以通过调用notifyPaused()请求自己从活动状态进入暂停状态;调用notifyDestroyed()请求进入销毁状态;调用resumeRequest()请求恢复到活动状态。但是具体应该怎么使用呢?怎样通过程序本身模拟状态之间的转换呢?

这些都可以通过Java.util包中的Timer 和TimerTask 类来实现。听说nokia的模拟器最接近真机,所以这次程序选择nokia s40 开发环境(唯一的不足就是不支持中文)。具体看如下演示程序:

import javax.microedition.midlet.MIDlet;

import java.util.*;

/*

* 创建日期 2005-10-8

*

* TODO 要更改此生成的文件的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

/**

* @author Snail

*

* TODO 要更改此生成的类型注释的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

public class MyTimerTask extends TimerTask {

private MIDlet midlet;

/**

*

*/

public MyTimerTask(MIDlet midlet) {

// TODO 自动生成构造函数存根

System.out.println("MyTimerTask contrUCtor");

this.midlet = midlet;

}

public void run(){

System.out.println("run() called");

midlet.resumeRequest();

}

}

import javax.microedition.midlet.MIDlet;

import javax.microedition.lcdui.*;

import java.util.*;

import javax.microedition.midlet.MIDletStateChangeException;

/*

* 创建日期 2005-10-8

*

* TODO 要更改此生成的文件的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

/**

* @author Snail

*

* TODO 要更改此生成的类型注释的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

public class MidletTest extends MIDlet implements CommandListener{

private Timer timer;

private MyTimerTask mtk;

private Command exit;

/**

*

*/

public MidletTest() {

System.out.println("MidletTest Constructor");

//初始化Timer对象

timer = new Timer();

}

/* (非 Javadoc)

* @see javax.microedition.midlet.MIDlet#startApp()

*/

protected void startApp() throws MIDletStateChangeException {

// TODO 自动生成方法存根

System.out.println("startApp Called");

exit = new Command("EXIT", Command.EXIT, 1);

Form f = new Form("MidletTest");

String s = new String("I'll come back soon!");

f.append(s);

f.addCommand(exit);

f.setCommandListener(this);

Display.getDisplay(this).setCurrent(f);

try{

//画面停留4秒 即活动状态 时间为4秒

Thread.sleep(4000);

}catch(Exception e){}

System.out.println("Ready to paused");

try{

mtk = null;

//获得当前Midlet基类的引用(向上转型)

mtk = new MyTimerTask(this);

//执行该任务等待 2秒

timer.schedule(mtk, 2000);

//请求进入暂停状态

pauseApp();

notifyPaused();

}catch(Exception e){}

}

/* (非 Javadoc)

* @see javax.microedition.midlet.MIDlet#pauseApp()

*/

protected void pauseApp() {

// TODO 自动生成方法存根

System.out.println("pauseApp Called");

}

/* (非 Javadoc)

* @see javax.microedition.midlet.MIDlet#destroyApp(boolean)

*/

protected void destroyApp(boolean arg0)throws MIDletStateChangeException {

// TODO 自动生成方法存根

System.out.println("destroyApp Called:" + arg0);

//停止Timer ,和TimerTask合同期满,脱离关系

timer.cancel();

}

public void commandAction(Command c, Displayable d){

if(c == exit){

try{

destroyApp(false);

notifyDestroyed();

}catch(MIDletStateChangeException e){}

}

}

}

通过上面程序可以看到, 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);

timer.schedule(mtk, 2000);

首先实例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{

mtk = null;

//获得当前Midlet基类的引用(向上转型)

mtk = new MyTimerTask(this);

//执行该任务等待 2秒

timer.schedule(mtk, 2000);

//请求进入暂停状态

pauseApp();

notifyPaused();

}catch(Exception e){}

现在把其中的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包。

到此,就暂告一段落!旅行还将继续…… (出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有