J2ME Timer 使用指南_JSP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦: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教程/更新時(shí)間:2008-08-22
      相關(guān)JSP教程