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

Java ME 開發:也說 MVC 設計模式(三)

     編輯:J2ME

分析

1. MainMidlet 調用控制器 UIController

controller = new UIController(this);
try {
    controller.init();
} catch (IOException e) {
    e.printStackTrace();
}

2. 控制器採用事件機制實現

在 UIController 中建立事件 ID 內部類:

public static class EventID {
    private EventID() {}
    public static final byte EVENT_EXIT = 0;
    public static final byte EVENT_NEXT_WELCOME_SCREEN = 1;
    public static final byte EVENT_NEXT_USER_REGIST_SCREEN = 2;
    public static final byte EVENT_USER_REGIST_EDIT = 3;
    public static final byte EVENT_USER_REGIST_EDIT_BACK = 4;
    public static final byte EVENT_NEXT_ACTIVE_SCREEN = 5;
    // ...
}

3. 一次性初始化所有界面,分配記憶體

視圖類多次重用,若每次調用都 new 初始化,手機有限記憶體很快耗盡,導致程式自動退出。

private void initObject() {
    welcomeScreen = new WelcomeScreen(this);
    reg = new UserRegist(this);
    activeScreen = new ActiveScreen(this);
    // ...
    textBox = new PopUpTextBox(this, "輸入文本", "", 1000, TextField.ANY);
}

4. 控制器對視圖處理採用狀態機實現

public void handleEvent(int eventID, Object[] args) {
    switch (eventID) {
        case EventID.EVENT_EXIT:
            midlet.exit(false); break;
        case EventID.EVENT_NEXT_WELCOME_SCREEN:
            welcomeScreen.show();
            midlet.setCurrent(welcomeScreen); break;
        case EventID.EVENT_NEXT_USER_REGIST_SCREEN:
        case EventID.EVENT_USER_REGIST_EDIT_BACK:
            reg.show(args);
            Thread thread = new Thread(reg);
            thread.start();
            midlet.setCurrent(reg); break;
        case EventID.EVENT_USER_REGIST_EDIT:
            textBox.init(args);
            midlet.setCurrent(textBox); break;
        case EventID.EVENT_NEXT_ACTIVE_SCREEN:
            activeScreen.show(args);
            Thread thread = new Thread(activeScreen);
            thread.start();
            midlet.setCurrent(activeScreen); break;
        // ...
        default: break;
    }
}

5. 視圖類初始化需傳入控制器

private UIController controller;
public WelcomeScreen(UIController control) {
    super(false);
    controller = control;
}

6. 視圖切換事件響應

在 keyPressed 中判斷按鍵事件,調用 UIController.handleEvent:

protected void keyPressed(int keycode) {
    switch (keycode) {
        case KeyID.SOFT_RIGHT:
            controller.handleEvent(UIController.EventID.EVENT_EXIT, null); break;
        case KeyID.SOFT_LEFT: {
            String editor = "regist_name";
            Object[] args = {"registScreen", editor, null, null, null};
            controller.handleEvent(UIController.EventID.EVENT_NEXT_USER_REGIST_SCREEN, args); break;
        }
        default: ;
    }
}

7. 控制器透過 handleEvent 的 args 傳遞參數

String update = "start";
Object[] args = {"activeScreen", null, update};
controller.handleEvent(UIController.EventID.EVENT_NEXT_ACTIVE_SCREEN, args);

8. 模型層

UserDataItem 存儲用戶註冊資訊,UserDataRecord 操作記錄。視圖類中調用方式:

private UserDataRecord userRecord;
userRecord = new UserDataRecord();
userRecord.db_deleteAllRecord();
if (userRecord.db_getRecord(1) == null) {
    UserDataItem userItem = new UserDataItem(1, (username + "," + passwd).getBytes());
    userRecord.db_addRecord(userItem);
    userItem = null;
    System.gc();
}

9. 封裝自定義控件

包 com.token.view.components 封裝視圖類使用的自定義控件。

綜上,實現了模型、視圖、控制的分離。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved