首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

利用 Timer 與 TimerTask 實作 MIDP 歡迎畫面(Splash Screen)

     編輯:J2ME

歡迎畫面的設計需求

啟動時顯示品牌 Logo、版本資訊,經過固定時間(如 3 秒)或使用者按任意鍵後自動切換至主畫面。核心在於「定時自動跳轉」與「使用者可提前跳過」兩條路徑的同步處理。

核心類別:Timer 與 TimerTask

  • java.util.Timer:排程器,內部維護一條執行緒,負責在指定時間或週期性執行任務。
  • java.util.TimerTask:實作 Runnable 的任務載體,覆寫 run() 放入具體邏輯。

架構設計:兩個類別協作

  1. SplashScreen(繼承 Canvas):負責繪製歡迎圖片、初始化 Timer、處理按鍵事件。
  2. ShowMainScreen(繼承 TimerTask):定時觸發,呼叫 SplashScreen.dismiss() 切換畫面。

關鍵程式碼片段

SplashScreen.java

package splash.welcome.view;

import java.io.IOException;
import java.util.Timer;
import javax.microedition.lcdui.*;

public class SplashScreen extends Canvas {
    private Display display;
    private TextBox next;           // 主畫面佔位
    private Timer timer;
    private final int MAX_TIME = 3000; // 3 秒
    private Image image;
    private final String file = "/res/splash.png";

    public SplashScreen(Display display) {
        this.display = display;
        timer = new Timer();
        loadImage();
        display.setCurrent(this);
        // 排程:MAX_TIME 後執行 ShowMainScreen
        timer.schedule(new ShowMainScreen(this), MAX_TIME);
    }

    private void loadImage() {
        try { image = Image.createImage(file); }
        catch (IOException e) { e.printStackTrace(); }
    }

    protected void paint(Graphics g) {
        g.drawImage(image, 0, 0, Graphics.LEFT | Graphics.TOP);
    }

    protected void keyPressed(int key) {
        dismiss(); // 任意鍵立即跳過
    }

    public void dismiss() {
        timer.cancel(); // 取消定時器,防止重複執行
        next = new TextBox("Welcome", "Welcome to come here!", 40, TextField.ANY);
        display.setCurrent(next);
    }
}

ShowMainScreen.java

package splash.welcome.view;
import java.util.TimerTask;

public class ShowMainScreen extends TimerTask {
    private SplashScreen splash;
    public ShowMainScreen(SplashScreen splash) { this.splash = splash; }
    public void run() { splash.dismiss(); }
}

SplashMidlet.java

package splash.welcome.midlet;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import splash.welcome.view.SplashScreen;

public class SplashMidlet extends MIDlet {
    private Display display;
    private Canvas splash;

    public SplashMidlet() { display = Display.getDisplay(this); }

    protected void startApp() { splash = new SplashScreen(display); }
    protected void pauseApp() {}
    protected void destroyApp(boolean unconditional) {}
}

關鍵點總結

  1. Timer 單一執行緒:所有排程任務共用一條背景執行緒,任務執行時間過長會延遲後續任務;本例任務極簡(僅切換畫面),無阻塞風險。
  2. 雙重觸發去重:使用者按鍵與定時器可能同時觸發 dismiss(),timer.cancel() 具冪等性,重複呼叫安全。
  3. 資源釋放:Timer.cancel() 會終止排程執行緒(若無其他任務),避免記憶體洩漏。
  4. 簡易 MVC 雛形:雖本例未嚴格分離模型/視圖/控制器,但 SplashScreen(View/Controller)與 ShowMainScreen(Timer 觸發器)職責清晰,易於擴充。

進階擴充建議

  • 加入漸變動畫:在 paint() 中根據經過時間調整 Alpha 值。
  • 載入資源於背景執行緒:避免大圖解碼阻塞事件執行緒導致畫面凍結。
  • 支援觸控螢幕:補充 pointerPressed() 呼叫 dismiss()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved