J2ME Timer 使用指南_JSP教程
推薦:J2ME開發(fā)站點(diǎn)資源英文站點(diǎn) SUN J2ME WebSite http://java.sun.com/j2me/ 英文好的開發(fā)者應(yīng)該收藏的站點(diǎn)。 諾基亞開發(fā)論壇 http://discussion.forum.nokia.com/forum/ IBM alphaworks http
J2SE 1.3 里有一項(xiàng)新的改進(jìn),那就是提供了一個(gè)可以更簡(jiǎn)單的實(shí)現(xiàn)多任務(wù)調(diào)度執(zhí)行的定時(shí)器類,調(diào)度由一個(gè)后臺(tái)線程完成。MIDP 同樣也包含了這一改進(jìn),使得 J2ME 開發(fā)人員從中受益。
J2ME 提示了兩個(gè)類用來定義和調(diào)試任務(wù), 他們分別是 TimerTask 和 Timer。TimerTask 是用戶定義的需要被調(diào)度的所有任務(wù)的抽象基類。Timer 類在任務(wù)執(zhí)行的時(shí)候負(fù)責(zé)創(chuàng)建和管理執(zhí)行線程。
要定義一個(gè)任務(wù),定義一個(gè) TimerTask 的子類,并實(shí)現(xiàn) run 方法。例如
import java.util.*; public class MyTask extends TimerTask { public void run() { System.out.println( "Running the task" ); } } |
是不是覺得 run 方法很熟悉呢?那是因?yàn)?TimerTask 實(shí)現(xiàn)了 java.lang.Runnable 接口。 Timer 類調(diào)用這個(gè) run 方法來執(zhí)行各個(gè)任務(wù)。此外還有一點(diǎn)必須注意到,那就是每個(gè) run 方法所執(zhí)行的任務(wù)必須能夠盡快的終止,因?yàn)槊總(gè) Timer 對(duì)象在同一時(shí)間只能執(zhí)行一個(gè)任務(wù)。
定義好一個(gè)任務(wù)以后,你可以生成一個(gè) Timer 對(duì)象并調(diào)用 schedule 方法來調(diào)度它,就像下面的代碼演示的那樣:
import java.util.*; Timer timer = new Timer(); TimerTask task = new MyTask(); // 在執(zhí)行這個(gè)任務(wù)前等待十秒... timer.schedule( task, 10000 ); // 在執(zhí)行任務(wù)前等待十秒,然后每過十秒再執(zhí)行一次 timer.schedule( task, 5000, 10000 ); |
schedule 方法被重載了四次;每一個(gè)任務(wù)都可以在一個(gè)特定的時(shí)間點(diǎn)(使用一個(gè) Date 對(duì)象指定)或者延時(shí)特定的時(shí)間段(以毫秒為單位)之后執(zhí)行。你可以安排這個(gè)任務(wù)只執(zhí)行一次或者在一段特定的時(shí)間段里反復(fù)執(zhí)行。Timer 還提供了一個(gè) scheduleAtFixedRate 方法來根據(jù)該任務(wù)第一次執(zhí)行的時(shí)間來指定反復(fù)執(zhí)行時(shí)延長(zhǎng)的時(shí)間段。如果一個(gè)任務(wù)被延時(shí)了,被安排在后面執(zhí)行的任務(wù)就被相應(yīng)的縮短等待時(shí)間以“接上”被延時(shí)的任務(wù)。
每個(gè) Timer 對(duì)象都會(huì)創(chuàng)建和管理一個(gè)后臺(tái)線程。一般情況下,一個(gè)程序創(chuàng)建一個(gè) Timer 就夠了,當(dāng)然也可以根據(jù)需要?jiǎng)?chuàng)建任意多個(gè)。你還可以在任何時(shí)候停止一個(gè) Timer 并終止后臺(tái)線程,方法是調(diào)用 cancel 方法。但要注意的是,一旦 Timer 并終止了,就不可能再恢復(fù)執(zhí)行,除非你重新生成一個(gè) Timer 對(duì)象并重新安排你想要執(zhí)行的任務(wù)。Timer 對(duì)象是線程安全的,你可以在多線程的環(huán)境下直接訪問 Timer 對(duì)象,而不用任何顯式的同步處理。
另外,每個(gè)任務(wù)提供了一個(gè) cancel 方法(繼承自 TimerTask 基類),你可以在任務(wù)執(zhí)行的過程當(dāng)中調(diào)用該方法來終止該任務(wù)。一旦你終止了該任務(wù),那么它將退出任務(wù)調(diào)度。你可以在任何時(shí)間調(diào)用每個(gè)任務(wù)的 cancel 方法來終止該任務(wù)的執(zhí)行,哪怕該任務(wù)還一次都沒有執(zhí)行過。
下面提供了一個(gè)簡(jiǎn)示的 MIDlet 示例來演示 Timer 的使用,我們將利用定時(shí)器來模擬一個(gè)星空移動(dòng)的效果。星星用一個(gè)點(diǎn)來表示,這使用到了低界圖形 API。關(guān)于低界圖形 API 更詳細(xì)的介紹,請(qǐng)參考我的另一篇文章《使用 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 使用了一個(gè) Timer 對(duì)象 timer 來調(diào)度執(zhí)行一個(gè) TimerTask 任務(wù) FieldMover,時(shí)間間隙 100 毫秒。FieldMover 處理星空的更新并重繪任務(wù),使得整個(gè)星空不斷得往屏幕下方“延伸”。這樣就生成了一個(gè)簡(jiǎn)單的星空移動(dòng)的效果。
分享: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顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
JSP教程Rss訂閱編程教程搜索
JSP教程推薦
- jsp頁面中顯示word/excel格式的文檔的方法
- Apache FileUpload的兩種上傳方式介紹及應(yīng)用
- 談CSV文件的生成與分析
- 用J2ME在移動(dòng)設(shè)備上實(shí)現(xiàn)動(dòng)畫1
- 純JSP+DWR實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)下拉選擇菜單實(shí)現(xiàn)技巧
- 解讀java的命名習(xí)慣
- JSP環(huán)境配置TOMCAT的內(nèi)存和連接數(shù)配置詳解
- 在J2ME手機(jī)編程中使用字體
- 八種優(yōu)化JSP/Servlet應(yīng)用程序的方法
- 基于Jave的Web服務(wù)工作機(jī)制6
- 相關(guān)鏈接:
- 教程說明:
JSP教程-J2ME Timer 使用指南
。