亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

J2ME最佳實踐之屏幕導(dǎo)航

系統(tǒng) 1716 0

作者:asklxf 文章來源: http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=964

屏幕導(dǎo)航

除了游戲程序,在通常的MIDP應(yīng)用程序中,通常會有很多個Screen或Canvas,這些屏幕一般靠命令來實現(xiàn)切換,比如用戶點擊“Next”應(yīng)該跳到下一屏,點擊“Back”應(yīng)該返回到上一屏。當(dāng)屏幕數(shù)量相當(dāng)可觀時,如何在各個屏幕之間導(dǎo)航就值得好好考慮了。

經(jīng)典的MVC模式可用于屏幕導(dǎo)航,Model用于存儲應(yīng)用程序數(shù)據(jù),而View則是各個Displayable對象,Controller需要單獨的一個類實現(xiàn)。由于MIDlet類本身在生命周期內(nèi)就只有一個實例,因此MIDlet類就非常適合作為Controller。SUN在blueprints示例程序SmartTicket中應(yīng)用了非常復(fù)雜的MVC,完全可以滿足MIDP應(yīng)用程序的導(dǎo)航需要,但是可以看出,缺點是很明顯的:

一是每一個事件都需要一個唯一標(biāo)識,switch-case語句會隨著屏幕的增加而增加,Controller變得難以維護。二是Controller引用了所有的View,這些View在程序啟動時就被初始化導(dǎo)致很大的內(nèi)存開銷,而不管它們是否會被顯示。三是大量的Model對象以及異常處理都使得整個應(yīng)用程序的邏輯大大復(fù)雜。

實際上,MIDP應(yīng)用程序的很多屏幕并不需要復(fù)雜的Controller和Model,我們的目標(biāo)是滿足基本的靈活性的同時保持結(jié)構(gòu)簡單。因此,另外兩種導(dǎo)航方法是用二叉樹和堆棧實現(xiàn),這里我們只討論 用堆棧實現(xiàn)的MIDP導(dǎo)航框架 ,其基本思想是:每當(dāng)前進到下一個屏幕時,先將下一個屏幕壓棧,然后再顯示;當(dāng)返回到上一個屏幕時,先從堆棧中彈出當(dāng)前屏幕,再從堆棧中取出上一個屏幕并顯示。因此,每個屏幕只需要指定要顯示的下一個屏幕,而不需記住上一個屏幕。這種堆棧導(dǎo)航模型特別適合有規(guī)律的“前進”、“后退”屏幕。

由于MIDlet類運行期只有一個實例,因此,使用MIDlet類作為控制器相當(dāng)合適。此外,我們在一個靜態(tài)變量中保存了MIDlet實例,使得訪問MIDlet更加方便:

public class ControllerMIDlet extends MIDlet {
private static ControllerMIDlet instance = null;

private Display display = null;
private Stack ui = new Stack();

public ControllerMIDlet() { instance = this; }

protected void startApp() {}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}

public static void goBack() {
instance.ui.pop();
Object obj = instance.ui.peek();
instance.display.setCurrent((Displayable)obj);
}

public static void forward(Displayable next) {
instance.ui.push(next);
instance.display.setCurrent(next);
}
}

讓我們更詳細(xì)地研究一下實際的應(yīng)用程序可能出現(xiàn)的幾種屏幕跳轉(zhuǎn)情況。最簡單的情況是,從一個屏幕前進到另一個屏幕,且返回時仍回到原先的屏幕,這種情況完全符合堆棧的FIFO特點,可以直接調(diào)用ControllerMIDlet的forward和goBack方法即可。例如,要顯示一個幫助屏幕:

對于一個聯(lián)網(wǎng)的應(yīng)用程序,另一種情況是有一個暫時的等待屏幕。下面是一個在線瀏覽圖片的屏幕:

與上面的情況所不同的是,如果用戶在屏幕3選擇“返回”,則應(yīng)當(dāng)回到屏幕1而不是屏幕2,因此,對于屏幕2到屏幕3的切換,就不能forward,我們使用replace,拋棄屏幕2,從而實現(xiàn)屏幕3直接可以goBack到屏幕1:

public static void replace(Displayable next) {
instance.ui.pop();
instance.ui.push(next);
instance.display.setCurrent(next);
}

堆棧的變化如下:

對于某些更為復(fù)雜的情況,例如,登錄過程,如果允許用戶選擇自動登錄,則屏幕跳轉(zhuǎn)如下:

如果用戶不選擇自動登錄,則屏幕跳轉(zhuǎn)如下:

對于這種情況,解決方案是,即使用戶選擇了自動登錄,LoginUI屏幕也要被壓入堆棧中,但是不顯示出來,因此,我們定義了另一個forward(Displayable d1, Displayable d2)方法,它將d1和d2依次壓入堆棧,但只顯示d2。在返回時,如果用戶取消,則返回到LoginUI??傊?,通過定義多個導(dǎo)航方法,就可以實現(xiàn)各種操作。

這種基于堆棧的導(dǎo)航模型非常適用于有規(guī)律的“前進”,“后退”屏幕,而且只在需要的時候生成新的屏幕。無需關(guān)心屏幕狀態(tài),因為返回時上一個屏幕的狀態(tài)被完整地保存在堆棧中。

堆棧模型的缺點是數(shù)據(jù)由不同的屏幕處理,對于一些流程而言,可能需要將每個屏幕的數(shù)據(jù)依次傳遞給下一個屏幕,越往后的屏幕其構(gòu)造方法的參數(shù)可能也越多。

對于聯(lián)網(wǎng)操作等涉及到多線程等待屏幕的情況,我們將在后面給出一個完整的解決方案,并集成到堆棧導(dǎo)航框架中,使應(yīng)用程序本身完全不用涉及到多線程聯(lián)網(wǎng)操作,只需專注于自身邏輯。

J2ME最佳實踐之屏幕導(dǎo)航


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一区二区在线播放福利视频 | 日韩免费观看一级毛片看看 | 羞羞视频在线观看视频 | 九九夜夜操妹子 | 久久久久久一级毛片免费无遮挡 | 高清视频 一区二区三区四区 | 久热九九| 亚洲精品视频网 | 成人国产在线视频在线观看 | 亚洲欧美中文日韩在线 | 99热久久国产精品这里有6 | 久久99久久99小草精品免视看 | 国产成人综合在线 | 天天艹夜夜| 国产国产成人人免费影院 | 日本一级毛片片免费观看 | 国内精品视频一区二区八戒 | 天天射综合网站 | 亚洲精品99久久久久中文字幕 | 精品国产乱码一区二区三区 | 国产色av | 草久视频在线 | 色婷婷综合久久久久中文一区二区 | 中文字幕日韩女同互慰视频 | 欧美第3页 | 精品国产乱码一区二区三区麻豆 | 手机看片神马午夜片 | 国产在线观看精品香蕉v区 国产在线观看美女福利精 国产在线观看午夜不卡 | 欧美日韩国产成人综合在线 | 六月色 | 国产手机在线视频放线视频 | 天天综合色网 | 亚洲欧美精品国产一区色综合 | 911精品国产亚洲日本美国韩国 | 爱爱毛片| 久热这里只有 | 久久国产午夜精品理论片34页 | 成人香蕉视频 | 最猛黑人xxxⅹ黑人猛交 | 4虎影院永久地址www | 91青青青青青爽在线 |