【分析】
1 在MainMidlet調用控制器UIController,並向UIController傳遞midlet作為參數。
- controller=new UIController(<span style="color:#ff0000;">this</span>);
- try {
- controller.init();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- 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 一次性初始化所有界面,分配內存,調用時,只是執行視圖類的show方法。為什麼不將初始話放在調用時進行呢?主要是因為視圖類有多次重用,如果每一次調用都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 視圖類初始化時,需要將控制器作為參數初始化,以對事件做出判斷。如WelcomeScreen.Java中先做出如下聲明:
- private UIController controller;
再在構造函數中,傳遞控制器
- public WelcomeScreen(UIController control) {
- // TODO Auto-generated constructor stub
- super(false);
- controller=control;
6 視圖切換事件響應采用如下方式,在keyPressed中,對按鍵事件進行判斷,然後調用UIController的handEvent方法。
- 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 控制器可以通過handEvent的args傳遞參數,如
- String update = "start";
- Object [] args = {"activeScreen", null, update};
- controller.handleEvent(UIController.EventID.EVENT_NEXT_ACTIVE_SCREEN,args);
UserRegist傳遞了一個update變量給下一個視圖。
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是對視圖類中使用的自定義控件的封裝
綜述,這樣就實現了模型、視圖、控制的分離。