`
izuoyan
  • 浏览: 9223076 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2ME最佳实践之屏幕导航

阅读更多

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

屏幕导航

除了游戏程序,在通常的MIDP应用程序中,通常会有很多个Screen或Canvas,这些屏幕一般靠命令来实现切换,比如用户点击“Next”应该跳到下一屏,点击“Back”应该返回到上一屏。当屏幕数量相当可观时,如何在各个屏幕之间导航就值得好好考虑了。

经典的MVC模式可用于屏幕导航,Model用于存储应用程序数据,而View则是各个Displayable对象,Controller需要单独的一个类实现。由于MIDlet类本身在生命周期内就只有一个实例,因此MIDlet类就非常适合作为Controller。SUN在blueprints示例程序SmartTicket中应用了非常复杂的MVC,完全可以满足MIDP应用程序的导航需要,但是可以看出,缺点是很明显的:

一是每一个事件都需要一个唯一标识,switch-case语句会随着屏幕的增加而增加,Controller变得难以维护。二是Controller引用了所有的View,这些View在程序启动时就被初始化导致很大的内存开销,而不管它们是否会被显示。三是大量的Model对象以及异常处理都使得整个应用程序的逻辑大大复杂。

实际上,MIDP应用程序的很多屏幕并不需要复杂的Controller和Model,我们的目标是满足基本的灵活性的同时保持结构简单。因此,另外两种导航方法是用二叉树和堆栈实现,这里我们只讨论用堆栈实现的MIDP导航框架,其基本思想是:每当前进到下一个屏幕时,先将下一个屏幕压栈,然后再显示;当返回到上一个屏幕时,先从堆栈中弹出当前屏幕,再从堆栈中取出上一个屏幕并显示。因此,每个屏幕只需要指定要显示的下一个屏幕,而不需记住上一个屏幕。这种堆栈导航模型特别适合有规律的“前进”、“后退”屏幕。

由于MIDlet类运行期只有一个实例,因此,使用MIDlet类作为控制器相当合适。此外,我们在一个静态变量中保存了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);
}
}

让我们更详细地研究一下实际的应用程序可能出现的几种屏幕跳转情况。最简单的情况是,从一个屏幕前进到另一个屏幕,且返回时仍回到原先的屏幕,这种情况完全符合堆栈的FIFO特点,可以直接调用ControllerMIDlet的forward和goBack方法即可。例如,要显示一个帮助屏幕:

对于一个联网的应用程序,另一种情况是有一个暂时的等待屏幕。下面是一个在线浏览图片的屏幕:

与上面的情况所不同的是,如果用户在屏幕3选择“返回”,则应当回到屏幕1而不是屏幕2,因此,对于屏幕2到屏幕3的切换,就不能forward,我们使用replace,抛弃屏幕2,从而实现屏幕3直接可以goBack到屏幕1:

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

堆栈的变化如下:

对于某些更为复杂的情况,例如,登录过程,如果允许用户选择自动登录,则屏幕跳转如下:

如果用户不选择自动登录,则屏幕跳转如下:

对于这种情况,解决方案是,即使用户选择了自动登录,LoginUI屏幕也要被压入堆栈中,但是不显示出来,因此,我们定义了另一个forward(Displayable d1, Displayable d2)方法,它将d1和d2依次压入堆栈,但只显示d2。在返回时,如果用户取消,则返回到LoginUI。总之,通过定义多个导航方法,就可以实现各种操作。

这种基于堆栈的导航模型非常适用于有规律的“前进”,“后退”屏幕,而且只在需要的时候生成新的屏幕。无需关心屏幕状态,因为返回时上一个屏幕的状态被完整地保存在堆栈中。

堆栈模型的缺点是数据由不同的屏幕处理,对于一些流程而言,可能需要将每个屏幕的数据依次传递给下一个屏幕,越往后的屏幕其构造方法的参数可能也越多。

对于联网操作等涉及到多线程等待屏幕的情况,我们将在后面给出一个完整的解决方案,并集成到堆栈导航框架中,使应用程序本身完全不用涉及到多线程联网操作,只需专注于自身逻辑。

分享到:
评论

相关推荐

    j2me最佳实践,UI设计

    ### J2ME最佳实践与UI设计关键知识点 #### 一、J2ME概述与MIDP版本 J2ME(Java 2 Micro Edition),由Sun Microsystems发布,是为小型设备和消费类电子产品设计的Java平台标准。其核心是MIDP(Mobile Information ...

    J2ME 最佳实践,J2ME 是Sun 发布的运行在小型设备上的微型版Java 的一系列标准

    ### J2ME最佳实践:构建高效且兼容性强的MIDP应用程序 J2ME,即Java 2 Platform, Micro Edition,是由Sun Microsystems为小型设备和嵌入式设备设计的Java平台,尤其适用于移动电话和PDAs等小型电子设备。本文旨在...

    J2ME实现专业屏幕切换于导航

    在J2ME(Java 2 Micro Edition)平台上开发移动应用时,专业且规范的屏幕切换与导航设计是至关重要的。这不仅提升了用户体验,也保证了应用程序的可维护性和扩展性。以下将详细讨论如何实现这一目标,以及相关的重要...

    j2me获取真机屏幕宽度 高度的小程序 源码

    在Java 2 Micro Edition (J2ME)平台上开发移动应用时,了解设备的屏幕尺寸是至关重要的。这有助于确保应用程序的界面布局适应不同大小的屏幕,提供良好的用户体验。标题和描述提到的是一款J2ME小程序,其源码专门...

    J2ME手机应用项目开发实践 源代码

    8. **事件处理**:J2ME使用回调函数处理用户输入和其他事件,如键盘输入、屏幕触摸等。 9. **模拟器与设备测试**:开发者通常使用Sun Microsystems(现Oracle)提供的J2ME Wireless Toolkit (J2ME WTK) 或NetBeans ...

    Eclipse开发J2ME之最佳插件-EclipseMe1.5.0

    Eclipse开发J2ME之最佳插件-EclipseMe1.5.0,供大家一起参考学习。

    J2ME开发 J2ME开发 J2ME开发

    "J2ME开发.pdf"可能包含J2ME的详细教程或者最佳实践,涵盖从基础语法到高级特性的讲解,包括UI设计(如Form和Canvas类)、数据持久化(RecordStore)、网络编程(HttpConnection和Socket)以及事件处理等。...

    j2me页面导航之堆栈模式源码

    在Java 2 Micro Edition (J2ME) 开发中,页面导航是构建用户界面的关键部分。堆栈模式是一种常见的页面管理策略,它模仿了计算机内存中的...对这些代码进行详细研究和实践,将有助于你深入理解J2ME页面导航的堆栈实现。

    J2ME手机应用项目开发实践

    这个“J2ME手机应用项目开发实践”是一个深入探讨如何利用J2ME进行手机应用开发的资源包,包含了实际项目的源代码,为开发者提供了宝贵的参考和学习材料。 J2ME的应用框架主要由两部分构成:MIDP(Mobile ...

    J2ME手机应用项目开发实践.iso

    J2ME手机应用项目开发实践.iso J2ME手机应用项目开发实践.iso

    J2ME手机游戏开发技术与实践 ppt与源代码 李政仪

    在2000年代中期,J2ME是开发手机游戏的主流技术之一,尤其在诺基亚、摩托罗拉等早期智能手机上广泛使用。本资源提供了“J2ME手机游戏开发技术与实践”的PPT和源代码,由李政仪编著,旨在帮助开发者深入理解J2ME游戏...

    kjava开发手册--介绍j2me开发的一些实践

    4. 开发 J2ME 之实践 4.1. 编写灵活的 RMS 应用 利用Record Management System (RMS) 存储应用数据,设计合理的数据结构和访问接口,以实现数据持久化。 4.2. 编写反应灵敏的联网提示界面 创建友好的用户界面,处理...

    j2me_plane.rar_j2me_j2me 飞机_j2me 飞机 游戏_飞机游戏

    对于初学者而言,这是一个很好的实践项目,不仅可以学习到基础的J2ME知识,还能锻炼编程思维和解决问题的能力。而"j2me_plane.rar"中的源代码正是这样一个实例,值得下载研究,以加深对J2ME游戏开发的理解。

    郭克华J2me课件与代码

    通过郭克华老师的J2ME课件与代码,学习者不仅可以掌握J2ME的基本概念和技术,还能了解到实际开发中的最佳实践,为开发自己的J2ME应用程序打下坚实基础。同时,配合视频教程,可以让学习更加直观和高效,帮助开发者...

    J2ME教材:J2ME&Gaming中文版

    8. **设备适配**:由于J2ME应用于多种设备,教材会涵盖如何编写跨平台的代码,以适应不同设备的屏幕尺寸、硬件性能差异。 9. **调试与部署**:讲解如何使用模拟器测试程序,以及将应用打包成JAR文件,通过蓝牙、...

    J2ME API 2.0 J2ME使用手册 J2ME帮助文档

    **J2ME API 2.0 - J2ME使用手册 - J2ME帮助文档** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的...通过深入学习和实践,开发者能够熟练掌握J2ME API,构建出高效且用户体验良好的移动应用程序。

    J2ME学习之环境搭建

    在本文中,我们将深入探讨如何搭建J2ME(Java Micro Edition)的学习环境,特别是使用Eclipse集成开发环境(IDE)和EclipseME插件。J2ME是Java平台的一个子集,专门用于嵌入式设备和移动设备的开发,如手机、智能...

    J2ME_Map.rar_J2ME 地图_J2ME游戏_j2me 游戏_j2me_m_绘制地图

    首先,地图设计是游戏世界构建的基础,它不仅包括地形、障碍物、路径等元素的布局,还涉及游戏世界的视觉风格和玩家导航机制。在J2ME中,地图通常以二维数组或网格的形式表示,每个单元格代表地图上的一个特定区域,...

    J2ME中文版教程 J2ME教程

    **J2ME中文版教程——全面解读移动设备编程** J2ME(Java 2 Micro Edition)是Java平台的一个重要组成部分,专为嵌入式设备、移动电话和其他...通过学习和实践,你将能够熟练地运用J2ME技术开发出富有创意的移动应用。

Global site tag (gtag.js) - Google Analytics