本文圍繞 J2ME Canvas 類事件傳輸的串行化機制進行分析與實證。根據 JavaDoc,J2ME 事件傳輸是串行化的:當一個事件方法調用完成後,下一個事件方法才會被調用,確保用戶上一次輸入處理完畢才響應下一次輸入。
MIDP 定義的事件方法包括:
showNotify() / hideNotify()keyPressed() / keyRepeated() / keyReleased()pointerPressed() / pointerDragged() / pointerReleased()paint()CommandListener.commandAction()假設:在 showNotify() 中調用 repaint() 請求重繪,會觸發 paint()。在每個事件方法中讓線程睡眠 2000ms,若確為串行化,程序將斷斷續續繪製按鍵名。
public class KeyCodes extends MIDlet { ... }
class KeyCodeCanvas extends Canvas implements CommandListener {
private String keyText = "hello let's go!";
protected void paint(Graphics g) {
System.out.println("I am invoked!");
// 繪製背景與 keyText
}
public void showNotify() {
repaint();
sleep(2000); // 模擬耗時操作
}
protected void keyPressed(int keyCode) {
keyText = getKeyName(keyCode);
repaint();
sleep(2000);
}
// ...
}
showNotify() 首先被調用,其 repaint() 請求不會立即繪製showNotify() 返回後,paint() 才開始執行showNotify() 結束後,緩存的按鍵事件依次被處理,每個事件間隔 2 秒繪製一次
Canvas JavaDoc 提到:
serviceRepaints() 可強制執行掛起的繪圖請求showNotify()/hideNotify() 使用注意事項開發者可參考 JavaDoc 了解進一步細節。實驗確認:J2ME 事件傳輸確實嚴格串行化,事件處理互不打斷,按順序隊列處理。