仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1287|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA编程:J2ME Timer 利用指南

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:36:16 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。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();//stopscrolling
destroyApp(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处置星空的更新偏重绘义务,使得全部星空不休得往屏幕下方“延长”。如许就天生了一个复杂的星空挪动的效果。


再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。
活着的死人 该用户已被删除
沙发
 楼主| 发表于 2015-3-6 18:06:51 | 显示全部楼层
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-10 18:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表