`
duyouhua1214
  • 浏览: 236924 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

J2ME编程最佳实践之屏幕导航

    博客分类:
  • j2me
阅读更多

除了游戏程序,在通常的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。总之,通过定义多个导航方法,就可以实现各种操作。

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

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

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

 

来源:http://www.grzz.com.cn/program/jsp/4300/

分享到:
评论

相关推荐

    J2ME编程入门PPT

    J2ME,全称Java Micro Edition,是Sun Microsystems(现已被Oracle公司收购)为嵌入式设备和消费类电子产品设计的开发平台。它与J2SE(Java Standard Edition)和J2EE(Java Enterprise Edition)一同构成了Java技术...

    J2ME编程环境

    java游戏开发\游戏基础开发9月1日课件\J2ME编程环境

    j2me编程api,j2me编程api

    j2me编程apij2me编程aj2me编程apipij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程apij2me编程api

    tengge手机端j2me编程教程完整版

    1.8本官方j2me编程类库参考,可以使用uc浏览器查看。 2.tengge手机端j2me教程,80多节,内含示例程序、做好的软件和效果图片。 3.手机端j2me编译工具janino.jar。 4.手机端j2me预审核工具preverifier.jar。 ...

    BlackBerry J2ME 编程指南

    ### BlackBerry J2ME 编程指南 #### 第一篇:J2ME编程基本指南 ##### 1 引言 根据mobile vision的最新报告,在移动开发市场上,尽管2008年之前Java ME一直占据开发者关注度的主要位置,但逐渐被新兴开发技术超越...

    J2ME游戏编程ydaima.rar

    《J2ME游戏编程》是一本专注于教授如何利用Java Micro Edition(J2ME)平台开发游戏的书籍。J2ME是Java技术的一个分支,主要用于移动设备和嵌入式系统,如早期的智能手机、功能手机以及某些家用电器。本书旨在帮助...

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

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

    j2me编程教学

    总之,J2ME编程教学将带你逐步进入移动开发的世界,通过理论结合实践,使你具备开发和维护J2ME应用的能力。无论你是初学者还是有一定经验的开发者,这套教程都将提供宝贵的知识和技巧,助你在J2ME领域取得成功。继续...

    j2me最佳实践,UI设计

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

    J2me编程100例的随书源码

    J2me编程100例的随书源码...J2me编程100例的随书源码..J2me编程100例的随书源码..

    j2me手机高级编程

    《J2ME手机高级编程》涉及的是Java 2 Micro Edition(J2ME)在移动设备上的高级应用开发,尤其关注无线通信、游戏开发、电子地图浏览、播放器实现、持久化存储、移动商务应用以及XML模型的应用。这些主题涵盖了移动...

    大连理工大学J2ME编程英语课件

    【J2ME编程基础知识】 Java 2 Platform, Micro Edition(J2ME)是Java平台的一个子集,专门设计用于资源有限的嵌入式设备,如移动电话、智能卡和家用电器。大连理工大学的J2ME编程英语课件深入介绍了如何在这些小型...

    J2ME游戏编程

    **J2ME游戏编程**是移动设备上的游戏开发领域,主要针对Java Micro Edition(J2ME)平台。J2ME是一种轻量级的Java平台,主要用于嵌入式系统,包括手机、PDA和其他小型设备。它由两部分组成:KVM(K Virtual Machine...

    J2ME蓝牙编程 J2ME蓝牙编程

    **J2ME蓝牙编程详解** Java 2 Micro Edition (J2ME) 是一种Java平台,专为嵌入式设备和移动设备设计,如早期的智能手机和平板电脑。它提供了丰富的功能,包括支持无线通信,其中就包括蓝牙(Bluetooth)编程。在...

    j2me编程Google地图实现经代码

    **J2ME编程与Google地图实现** 在移动设备上实现地图功能是许多应用程序的核心需求,尤其是在GPS导航领域。J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为资源有限的嵌入式设备如手机和PDA设计。本教程将...

    扫雷源代码,手机游戏,J2ME编程

    扫雷是一款广受欢迎的经典...对于初学者来说,这是一个很好的实践项目,可以帮助他们掌握基础的J2ME编程技巧,并锻炼解决问题的能力。同时,通过分析和改进现有的源代码,开发者还可以深化对游戏设计和Java编程的理解。

    J2ME编程简介(内含游戏案例)

    【J2ME编程简介】是针对Java 2 Platform, Micro Edition (J2ME)的一份详细教程,尤其适合初学者入门。J2ME是Java平台的一个版本,专门设计用于资源有限的嵌入式和移动设备,如手机和PDA。本书通过讲解一个名为“调皮...

    精通J2ME无线编程.pdf

    《精通J2ME无线编程》是一本专注于Java Micro Edition(J2ME)移动开发的专业书籍。J2ME是Java技术的一个重要分支,主要用于嵌入式设备和移动通信设备的开发,如早期的智能手机、功能手机以及一些家用电器的控制系统...

    J2ME编程源代码(书中代码)

    每个示例源代码都可能涵盖上述一个或多个方面,通过研究和实践这些例子,开发者能够深入理解J2ME的各个方面,提高编程技能。对于初学者而言,从简单的控制台程序开始,逐步过渡到复杂的图形界面和网络应用,这是一个...

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

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

Global site tag (gtag.js) - Google Analytics