程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> JavaMe開發:也說MVC設計模式(3)

JavaMe開發:也說MVC設計模式(3)

編輯:J2ME

【分析】

1 在MainMidlet調用控制器UIController,並向UIController傳遞midlet作為參數。

  1. controller=new UIController(<span style="color:#ff0000;">this</span>);
  2. try {
  3. controller.init();
  4. } catch (IOException e) {
  5. // TODO Auto-generated catch block
  6. e.printStackTrace();
  7. }//

2 控制器的實現是通過一個事件的機制實現的, 在UIController中,先建立一個事件ID的內部類。

  1. public static class EventID{
  2. private EventID(){
  3. }
  4. public static final byte EVENT_EXIT = 0;//退出
  5. public static final byte EVENT_NEXT_WELCOME_SCREEN = 1;//歡迎界面
  6. public static final byte EVENT_NEXT_USER_REGIST_SCREEN = 2;//用戶注冊
  7. public static final byte EVENT_USER_REGIST_EDIT = 3;//用戶注冊編輯
  8. public static final byte EVENT_USER_REGIST_EDIT_BACK = 4;//用戶注冊編輯返回
  9. public static final byte EVENT_NEXT_ACTIVE_SCREEN = 5;
  10. //...
  11. }

3 一次性初始化所有界面,分配內存,調用時,只是執行視圖類的show方法。為什麼不將初始話放在調用時進行呢?主要是因為視圖類有多次重用,如果每一次調用都new(初始化,分配內存)一次,手機有限的內存很快會被用光,這是會出現一些程序自動退出的問題。

  1. private void initObject()
  2. {
  3. welcomeScreen = new WelcomeScreen(this);
  4. reg= new UserRegist(this);
  5. activeScreen = new ActiveScreen(this);
  6. ...
  7. textBox = new PopUpTextBox(this,"輸入文本","", 1000, TextFIEld.ANY);
  8. }

4 控制器對視圖的處理采用狀態機實現

  1. public void handleEvent( int eventID, Object[] args)
  2. {
  3. switch (eventID)
  4. {
  5. case EventID.EVENT_EXIT:
  6. {
  7. midlet.exit(false);
  8. break;
  9. }
  10. case EventID.EVENT_NEXT_WELCOME_SCREEN:
  11. {
  12. welcomeScreen.show();
  13. midlet.setCurrent(welcomeScreen);
  14. break;
  15. }
  16. case EventID.EVENT_NEXT_USER_REGIST_SCREEN:
  17. case EventID.EVENT_USER_REGIST_EDIT_BACK:
  18. {
  19. reg.show(args);
  20. Thread thread = new Thread(reg);
  21. thread.start();
  22. midlet.setCurrent(reg);
  23. break;
  24. }
  25. case EventID.EVENT_USER_REGIST_EDIT:
  26. {
  27. textBox.init(args);
  28. midlet.setCurrent(textBox);
  29. break;
  30. }
  31. case EventID.EVENT_NEXT_ACTIVE_SCREEN:
  32. {
  33. activeScreen.show(args);
  34. Thread thread = new Thread(activeScreen);
  35. thread.start();
  36. midlet.setCurrent(activeScreen);
  37. break;
  38. }
  39. //...
  40. default:
  41. break;
  42. }
  43. }

5 視圖類初始化時,需要將控制器作為參數初始化,以對事件做出判斷。如WelcomeScreen.Java中先做出如下聲明:

  1. private UIController controller;

再在構造函數中,傳遞控制器

  1. public WelcomeScreen(UIController control) {
  2. // TODO Auto-generated constructor stub
  3. super(false);
  4. controller=control;

6 視圖切換事件響應采用如下方式,在keyPressed中,對按鍵事件進行判斷,然後調用UIController的handEvent方法。

  1. protected void keyPressed(int keycode)
  2. {
  3. switch(keycode)
  4. {
  5. case KeyID.SOFT_RIGHT:
  6. {
  7. controller.handleEvent(UIController.EventID.EVENT_EXIT,null);
  8. break;
  9. }
  10. case KeyID.SOFT_LEFT:
  11. {
  12. String editor = "regist_name";
  13. Object [] args = {"registScreen",editor, null,null,null};
  14. controller.handleEvent(UIController.EventID.EVENT_NEXT_USER_REGIST_SCREEN,args);
  15. break;
  16. }
  17. default:;
  18. }
  19. }
  20. }

7 控制器可以通過handEvent的args傳遞參數,如

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

UserRegist傳遞了一個update變量給下一個視圖。

8 在看一下模型,在UserDataItem中存儲的是用戶注冊的信息。利用UserDataRecord類對記錄進行操作。

在視圖類中,通過以下方式調用:

先聲明

  1. private UserDataRecord userRecord;

構建對象

  1. userRecord = new UserDataRecord();

使用對象

  1. userRecord.db_deleteAllRecord();
  2. if(userRecord.db_getRecord(1)==null)
  3. {
  4. UserDataItem userItem = new UserDataItem(1,(username+","+passwd).getBytes());
  5. userRecord.db_addRecord(userItem);
  6. userItem = null;
  7. System.gc();
  8. }

9 包com.token.vIEw.components是對視圖類中使用的自定義控件的封裝

綜述,這樣就實現了模型、視圖、控制的分離。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved