J2ME Timer 使用指南 --IT man

Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.asp"></script>
J2ME Timer 使用指南
bsp
J2SE1.3里有一项新的改进,那就是提供了一个可以更简单的实现多任务调度执行的定时器类,调度由一个后台线程完成。MIDP同样也包含了这一改进,使得J2ME开发人员从中受益。
J2ME提示了两个类用来定义和调试任务,他们分别是TimerTask和Timer。TimerTask是用户定义的需要被调度的所有任务的抽象基类。Timer类在任务执行的时候负责创建和管理执行线程。
要定义一个任务,定义一个TimerTask的子类,并实现run方法。例如
importjava.util.*;publicclassMyTaskextendsTimerTask{publicvoidrun(){System.out.println("Runningthetask");}}
是不是觉得run方法很熟悉呢?那是因为TimerTask实现了java.lang.Runnable接口。Timer类调用这个run方法来执行各个任务。此外还有一点必须注意到,那就是每个run方法所执行的任务必须能够尽快的终止,因为每个Timer对象在同一时间只能执行一个任务。
定义好一个任务以后,你可以生成一个Timer对象并调用schedule方法来调度它,就像下面的代码演示的那样:
importjava.util.*;Timertimer=newTimer();TimerTasktask=newMyTask();//在执行这个任务前等待十秒...timer.schedule(task,10000);//在执行任务前等待十秒,然后每过十秒再执行一次timer.schedule(task,5000,10000);
schedule方法被重载了四次;每一个任务都可以在一个特定的时间点(使用一个Date对象指定)或者延时特定的时间段(以毫秒为单位)之后执行。你可以安排这个任务只执行一次或者在一段特定的时间段里反复执行。Timer还提供了一个scheduleAtFixedRate方法来根据该任务第一次执行的时间来指定反复执行时延长的时间段。如果一个任务被延时了,被安排在后面执行的任务就被相应的缩短等待时间以“接上”被延时的任务。
每个Timer对象都会创建和管理一个后台线程。一般情况下,一个程序创建一个Timer就够了,当然也可以根据需要创建任意多个。你还可以在任何时候停止一个Timer并终止后台线程,方法是调用cancel方法。但要注意的是,一旦Timer并终止了,就不可能再恢复执行,除非你重新生成一个Timer对象并重新安排你想要执行的任务。Timer对象是线程安全的,你可以在多线程的环境下直接访问Timer对象,而不用任何显式的同步处理。
另外,每个任务提供了一个cancel方法(继承自TimerTask基类),你可以在任务执行的过程当中调用该方法来终止该任务。一旦你终止了该任务,那么它将退出任务调度。你可以在任何时间调用每个任务的cancel方法来终止该任务的执行,哪怕该任务还一次都没有执行过。
下面提供了一个简示的MIDlet示例来演示Timer的使用,我们将利用定时器来模拟一个星空移动的效果。星星用一个点来表示,这使用到了低界图形API。关于低界图形API更详细的介绍,请参考我的另一篇文章《使用MIDP的低界用户界面API》。
importjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;importjava.util.*;publicclassTimerDemoextendsMIDlet{Displaydisplay;StarFieldfield=newStarField();FieldMovermover=newFieldMover();Timertimer=newTimer();publicTimerDemo(){display=Display.getDisplay(this);}protectedvoiddestroyApp(booleanunconditional){}protectedvoidstartApp(){display.setCurrent(field);timer.schedule(mover,100,100);}protectedvoidpauseApp(){}publicvoidexit(){timer.cancel();//stopscrollingdestroyApp(true);notifyDestroyed();}classFieldMoverextendsTimerTask{publicvoidrun(){field.scroll();}}classStarFieldextendsCanvas{intheight;intwidth;int[]stars;Randomgenerator=newRandom();booleanpainting=false;publicStarField(){height=getHeight();width=getWidth();stars=newint[height];for(inti=0;i<height;++i){stars[i]=-1;}}publicvoidscroll(){if(painting)return;for(inti=height-1;i>0;--i){stars[i]=stars[i-1];}stars[0]=(generator.nextInt()%(3*width))/2;if(stars[0]>=width){stars[0]=-1;}repaint();}protectedvoidpaint(Graphicsg){painting=true;g.setColor(0,0,0);g.fillRect(0,0,width,height);g.setColor(255,255,255);for(inty=0;y<height;++y){intx=stars[y];if(x==-1)continue;g.drawline(x,y,x,y);}painting=false;}protectedvoidkeypressed(intkeycode){exit();}}}
TimerDemoMIDlet使用了一个Timer对象timer来调度执行一个TimerTask任务FieldMover,时间间隙100毫秒。FieldMover处理星空的更新并重绘任务,使得整个星空不断得往屏幕下方“延伸”。这样就生成了一个简单的星空移动的效果。

J2ME Timer 使用指南 src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值