J2ME Timer 使用指南_JSP教程
推薦:J2ME開發(fā)站點資源英文站點 SUN J2ME WebSite http://java.sun.com/j2me/ 英文好的開發(fā)者應(yīng)該收藏的站點。 諾基亞開發(fā)論壇 http://discussion.forum.nokia.com/forum/ IBM alphaworks http
J2SE 1.3 里有一項新的改進,那就是提供了一個可以更簡單的實現(xiàn)多任務(wù)調(diào)度執(zhí)行的定時器類,調(diào)度由一個后臺線程完成。MIDP 同樣也包含了這一改進,使得 J2ME 開發(fā)人員從中受益。
J2ME 提示了兩個類用來定義和調(diào)試任務(wù), 他們分別是 TimerTask 和 Timer。TimerTask 是用戶定義的需要被調(diào)度的所有任務(wù)的抽象基類。Timer 類在任務(wù)執(zhí)行的時候負(fù)責(zé)創(chuàng)建和管理執(zhí)行線程。
要定義一個任務(wù),定義一個 TimerTask 的子類,并實現(xiàn) run 方法。例如
import java.util.*; public class MyTask extends TimerTask { public void run() { System.out.println( "Running the task" ); } } |
是不是覺得 run 方法很熟悉呢?那是因為 TimerTask 實現(xiàn)了 java.lang.Runnable 接口。 Timer 類調(diào)用這個 run 方法來執(zhí)行各個任務(wù)。此外還有一點必須注意到,那就是每個 run 方法所執(zhí)行的任務(wù)必須能夠盡快的終止,因為每個 Timer 對象在同一時間只能執(zhí)行一個任務(wù)。
定義好一個任務(wù)以后,你可以生成一個 Timer 對象并調(diào)用 schedule 方法來調(diào)度它,就像下面的代碼演示的那樣:
import java.util.*; Timer timer = new Timer(); TimerTask task = new MyTask(); // 在執(zhí)行這個任務(wù)前等待十秒... timer.schedule( task, 10000 ); // 在執(zhí)行任務(wù)前等待十秒,然后每過十秒再執(zhí)行一次 timer.schedule( task, 5000, 10000 ); |
schedule 方法被重載了四次;每一個任務(wù)都可以在一個特定的時間點(使用一個 Date 對象指定)或者延時特定的時間段(以毫秒為單位)之后執(zhí)行。你可以安排這個任務(wù)只執(zhí)行一次或者在一段特定的時間段里反復(fù)執(zhí)行。Timer 還提供了一個 scheduleAtFixedRate 方法來根據(jù)該任務(wù)第一次執(zhí)行的時間來指定反復(fù)執(zhí)行時延長的時間段。如果一個任務(wù)被延時了,被安排在后面執(zhí)行的任務(wù)就被相應(yīng)的縮短等待時間以“接上”被延時的任務(wù)。
每個 Timer 對象都會創(chuàng)建和管理一個后臺線程。一般情況下,一個程序創(chuàng)建一個 Timer 就夠了,當(dāng)然也可以根據(jù)需要創(chuàng)建任意多個。你還可以在任何時候停止一個 Timer 并終止后臺線程,方法是調(diào)用 cancel 方法。但要注意的是,一旦 Timer 并終止了,就不可能再恢復(fù)執(zhí)行,除非你重新生成一個 Timer 對象并重新安排你想要執(zhí)行的任務(wù)。Timer 對象是線程安全的,你可以在多線程的環(huán)境下直接訪問 Timer 對象,而不用任何顯式的同步處理。
另外,每個任務(wù)提供了一個 cancel 方法(繼承自 TimerTask 基類),你可以在任務(wù)執(zhí)行的過程當(dāng)中調(diào)用該方法來終止該任務(wù)。一旦你終止了該任務(wù),那么它將退出任務(wù)調(diào)度。你可以在任何時間調(diào)用每個任務(wù)的 cancel 方法來終止該任務(wù)的執(zhí)行,哪怕該任務(wù)還一次都沒有執(zhí)行過。
下面提供了一個簡示的 MIDlet 示例來演示 Timer 的使用,我們將利用定時器來模擬一個星空移動的效果。星星用一個點來表示,這使用到了低界圖形 API。關(guān)于低界圖形 API 更詳細(xì)的介紹,請參考我的另一篇文章《使用 MIDP 的低界用戶界面 API》。
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; public class TimerDemo extends MIDlet { Display display; StarField field = new StarField(); FieldMover mover = new FieldMover(); Timer timer = new Timer(); public TimerDemo() { display = Display.getDisplay( this ); } protected void destroyApp( boolean unconditional ) { } protected void startApp() { display.setCurrent( field ); timer.schedule( mover, 100, 100 ); } protected void pauseApp() { } public void exit(){ timer.cancel(); // stop scrolling destroyApp( true ); notifyDestroyed(); } class FieldMover extends TimerTask { public void run(){ field.scroll(); } } class StarField extends Canvas { int height; int width; int[] stars; Random generator = new Random(); boolean painting = false; public StarField(){ height = getHeight(); width = getWidth(); stars = new int[ height ]; for( int i = 0; i < height; i ){ stars[i] = -1; } } public void scroll() { if( painting ) return; for( int i = 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(); } protected void paint( Graphics g ){ painting = true; g.setColor( 0, 0, 0 ); g.fillRect( 0, 0, width, height ); g.setColor( 255, 255, 255 ); for( int y = 0; y < height; y ){ int x = stars[y]; if( x == -1 ) continue; g.drawline( x, y, x, y ); } painting = false; } protected void keypressed( int keycode ){ exit(); } } } |
TimerDemo MIDlet 使用了一個 Timer 對象 timer 來調(diào)度執(zhí)行一個 TimerTask 任務(wù) FieldMover,時間間隙 100 毫秒。FieldMover 處理星空的更新并重繪任務(wù),使得整個星空不斷得往屏幕下方“延伸”。這樣就生成了一個簡單的星空移動的效果。
分享:J2ME開發(fā)步驟1. 系統(tǒng)要求 Pentium 100以上CPU 64MB 內(nèi)存 Windows NT Workstation 4.0(Service Pack 3)或Windows 98 6 MB自由硬盤空間 Java 2 SDK, Standard Version, 版本1.2.2或者更高
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-J2ME Timer 使用指南
。