controller = new UIController(this);
try {
controller.init();
} catch (IOException e) {
e.printStackTrace();
}
在 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;
// ...
}
視圖類多次重用,若每次調用都 new 初始化,手機有限記憶體很快耗盡,導致程式自動退出。
private void initObject() {
welcomeScreen = new WelcomeScreen(this);
reg = new UserRegist(this);
activeScreen = new ActiveScreen(this);
// ...
textBox = new PopUpTextBox(this, "輸入文本", "", 1000, TextField.ANY);
}
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;
}
}
private UIController controller;
public WelcomeScreen(UIController control) {
super(false);
controller = control;
}
在 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: ;
}
}
String update = "start";
Object[] args = {"activeScreen", null, update};
controller.handleEvent(UIController.EventID.EVENT_NEXT_ACTIVE_SCREEN, args);
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();
}
包 com.token.view.components 封裝視圖類使用的自定義控件。
綜上,實現了模型、視圖、控制的分離。