《基于J2ME手机网络版小说阅读器设计与开发——毕业设计.doc》由会员分享,可在线阅读,更多相关《基于J2ME手机网络版小说阅读器设计与开发——毕业设计.doc(35页珍藏版)》请在三一办公上搜索。
1、毕业设计说明书件职业技术学院软件学院学生姓名: 学号: 学 院: 专 业: 指导教师: 2010年6月手机网络版小说阅读器设计与开发摘要近年来,随着信息技术的飞速发展,移动通讯与互联网的融合日趋明显,作为电子商务领域的新生力量移动商务,开始成为传统电子商务的有益补充,显示出巨大的发展潜力和成长空间。移动商务以其灵活、简单、方便的特点正受到越来越多人的关注,人们迫切希望能够享受到移动商务带来的便利。 国内外越来越多的厂商在Sun公司、摩托罗拉、西门子等公司的技术支持下开始开发基于J2ME平台的无线应用服务。J2ME 是SUN 公司针对嵌入式、消费类电子产品推出的开发平台,与J2SE 和J2EE
2、共同组成Java 技术的三个重要的分支。J2ME 实际上是一系列规范的集合,由JCP 组织制定相关的Java Specification Request(JSR)并发布,各个厂商会按照规范在自己的产品上进行实现,但是必须要通过TCK 测试,这样确保兼容性 。J2ME平台由于自身的特点,己经成为当前业界流行的无线应用开发支柱平台。利用J2ME提供的功能,电子商务、企业的商务应用等都可以扩展到无线上来,基于J2ME平台的手机应用开发已经成为热点。本文首先分析了J2ME在当前移动终端发展中所具有的重要角色,选择J2 ME作为移动终端软件开发平台的优势。实际开发了一个基于2ME平台的多媒体手机阅读器软
3、件,进行了相关理论和技术的分析。并在此基础上,对W3C提出的CC/PP框架进行了系统的分析,并针对这款手机阅读器进行了改进分析,以达到个性化服务的效果。关键词: 移动设备,J2ME,MIDP,阅读器Mobile STAND-ALONE NOVEL DESIGN AND DEVELOPMENT OF READERAbstractIn recent years, along with the information technology rapid development, Mobile communication and the Internet fusion is day by day obv
4、ious, took the electronic commerce domain the strength for new life-Mobile Commerce, started to become the tradition electronic commerce the beneficial supplement, demonstrated the huge development potential and the growth space.The motion commerce by its nimble, simple, the convenient characteristi
5、c is receiving the more and more many persons attention, the people earnestly hope can enjoy the convenience which brings to the motion commerce. The domestic and foreign more and more many manufacturers in companys under and so on Sun Corporation, Motorola, Simens technical support start to develop
6、 based on the J2ME platform wireless application service.J2ME is SUN Corporation the development platform which in view of embedded, the expense class electronic products promotes, composes the Java technology together with J2SE and J2EE three important branches.J2ME in fact is a series of standard
7、set, formulates related Java Specification Request(JSR) by the JCP organization and issued, each manufacturer can defer to the standard to carry on the realization on own product, but must have through the TCK test, to guarantee the compatibility like this.The J2ME platform as a result of own charac
8、teristic, oneself after becomes the current field popular wireless application development prop platform.The function provides which using J2ME, electronic commerce, enterprises commerce using and so on all may expand wireless to comes up, already became the hot spot based on the J2ME platform hands
9、et using the development.This essay first analyses the important role of J2 ME in thedevelopment of mobile terminal, the advantage of choosing J2ME as the development platform of mobile application. Developed a multi-media telephone reader application on the J2MEplatform, and carried out relevance t
10、heory and the technology analysis. After that, carried out systematic analysis on the CC/PP frame broght by W3C .Base the application, according the theory of CC/PP, carried out the improvement analysis and design, in order to achieve the effect of individuation service.Keyword: Mobile equipment, J2
11、ME, MIDP, Reader目 录1 引言31.1 课题背景31.2 研究目的31.3 论文组织结构32 J2ME技术概览32.1 开发环境32.2 J2ME的概念32.3 J2ME简介32.3.1 J2ME架构32.3.2 JVM ( 虚拟机 )32.3.3 MIDP( 移动信息设备简表 )32.4 Java Appication Manager33.1 本程序需解决的有关技术问题33.2 程序流程33.3 Canvas类33.4 Graphics类33.5 MIDP1.0技术下的绘制背景技术33.6 MIDP2.0新增的GameCanvas包33.7 PNG图片格式33.8内存的优化3
12、3.9 内存检测器33.10 关于混淆器34 程序分析和具体实现34.1 手机阅读器读取文本34.2 系统设计34.2.1 基本概念34.2.2 软件设计任务34.2.3 总体设计35手机游戏开发过程中的困难35.1 手机软件开发存在的困难35.1.1 移动开发存在的问题35.1.2 操作环境不兼容性问题35.1.3 不同的屏幕尺寸问题35.2 解决方案36 总结与展望36.1 J2ME手机游戏的优势36.2 J2ME手机软件的开发意义3参 考 文 献3致 谢31 引言1.1 课题背景手机是人们日常生活中所用的非常频繁的通信工具,虽然现在其费用比有线电话高,但是其随时随地的沟通优势,使人们摆脱
13、了线路的束缚。手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。目前几乎人手一部或几部手机,正是由于手机的高普及率,使得无线移动商务才得以迅速普及和发展。随着通讯技术的发展及手机的普及 ,人们正在不断地给手机增加新的功能 ,其中 ,使手机实现一般只有 PC机才具有的功能下载各种程序并运行 ,是目前手机发展的一个重要方向。为此 ,人们提出了各种各样的解决方案 ,其中基于 JAVA的 J2ME方案无疑是最引人注目的。JAVA技术已经从一种最初用来编写与硬件无关的嵌入式系统的编程语言变成了一种与厂商无关、与硬件无关的健壮的服务器端技术,
14、它使整个企业界可以全面发掘以Web为核心的应用程序的巨大潜力。随着JAVA技术的不断更新提高,J2ME技术的出现,使得手机游戏越来越成为我们关注的焦点。J2ME技术目前最流行的就是在制作手机游戏方面,JAVA手机的出现使得这一技术更有它的用武之地,发挥着他灵活、轻便、快捷的作用。近几年,由于微处理器性能的大幅提升,加上无线通讯技术的突破,手持式移动设备开始受到大众的青睐。短短几年内,手机已经升级了几代产品,普及率逐年攀升,生产效率不断上升,产品价格比个人电脑的摩尔定律有更惊人的下调,以至手机是大多是城市居民不可缺少的一件随身设备。继短信、彩信等服务之后,中国移动提供基于Java的百宝箱业务,应
15、用产品遍及商务应用、信息获取、英汉互译、游戏娱乐等多媒体领域。根据官方公布的统计数据,我国移动电话用户已突破3亿。依托这样的市场,一旦无线Java应用大规模开展起来,将会创造出比短信业务更为惊人的利润。Java语言原先的开发目的与市场的需求不谋而合,并且也已经成为手机应用程序开发的标准,国际大公司如Nokia、Motorola及Siemens等所设计的手机内都加入Java程序的支持,可见在不久的将来,Java将会成为移动设备上最热门的语言。手机中将Java语言引入,作为一种通用的开发标准,并将向市场推广普及仅仅短短几年,J2ME仍是一种新型的技术,中文资料除台湾出版过相关书籍外,国内相关介绍资
16、源很有限,国内J2ME开发商也屈指可数,名声较响的Digital-Red公司也仅成立于1999年。本文可算是对新技术的一些尝试,代表对无线平台应用程序推广的一些努力。1.2 研究目的随着人们对快节奏的学习充电的重视,对移动阅读的需求也相应增大,为了满足人们移动阅读的愿望,因此我们急需J2ME开发一款能满足人们日常阅读得简洁方便的手机软件。既然阅读器面向的是普通消费者而不是计算机专家,那么他们不可能深入的学习使用技巧。保持程序操作的简易是最基本的要求。阅读器最基本的功能包括:载入图书、前进、后退、存档、读取书签,更换背景。并且阅读器还可以阅读网络上的资源,实现资源利用的最大化。此外,该程序可下载
17、到手机上,随时随地的进行阅读,这样就可以通过这种方式开发一些学习软件,使手机用户可有一个随身学习的工具书。1.3 论文组织结构本篇论文共分为七个部分:包括引言,J2ME技术概览,需求分析、程序结构和相关技术,程序分析和具体实现,困难总结,前景展望和结论,参考文献及致谢。其中第四部分“程序分析和具体实现”是本篇论文的重点。整篇论文都是围绕着这一部分来展开论述的,在这一部分里详细介绍网络版手机阅读器的开发全过程和开发过程中存在的疑难问题。其中包括:手机阅读器如何读取文本,J2ME文本阅读器中的文本格式,读取文本文件的主要技术实现,将文本文件内容显示出来的技术实现,阅读器中的菜单设计技术实现。通过对
18、J2ME的详细介绍我们可以从中了解到其自身的作用,近年来,随着JAVA手机的诞生,其无可替代的灵活性与轻便性致使JAVA手机游戏成为游戏市场的又一亮点,它的前景无可限量,必将在我们以后的生活中发挥着重要的作用。2 J2ME技术概览2.1 开发环境操作系统:Microsoft Windows XP程序语言:Java 2开 发 包:Java(TM) 2 Standard Edition (5.0) Sun Micro. J2ME Wireless Tool Kit 2.2IDE:Eclipse 3.012.2 J2ME的概念J2ME的全称是Java2 Micro Edition (J2ME)Jav
19、a2技术微型版,与J2SE、J2EE一样都是有美国SUN微系统公司提出的JAVA技术规范。2.3 J2ME简介J2ME是为了能够开发运行在小型设备、独立设备、互联移动设备、嵌入式设备上的JAVA应用程序而被提出的。J2ME是建立在一个由概要描述、配置、JAVA虚拟机和操作系统等部分组成的标准架构之上的,这些内容共同组成了完整的J2ME实时运行环境。它的技术核心是由一个JAVA虚拟机( JVM )及一套适合运行在上述设备环境上的API接口构成。J2ME在1999年的JavaOne开发人员大会上初次亮相,它的目标是面向智能无线设备和小型计算设备的开发人员,这些开发人员需要在他们的产品中整合跨平台的
20、能力。无线设备和小型计算设备的消费者期望这些设备能够有较高的性能。他们希望小型计算设备有快速的响应时间,与同种设备相兼容,拥有功能完备的应用程序。消费者希望桌面计算机和笔记本电脑上的软件和功能同样能够运行在移动电话和个人数字助理上。为了满足他们的需求,开发人员必须重新考虑他们设计计算机系统的方式。开发人员需要利用商业计算机上现有的前端和后端软件的计算能力,并将这些能力传递到微型、移动和无线的计算设备上。J2ME能够以最小的修改来实现这种传递,如果应用程序的设计是可伸缩的,应用程序就可以适应小型计算设备上有限的资源。J2ME为在小型电子设备上创建性能卓越的网络应用提供了一套完整的解决方案,能很好
21、的解决软件跨平台的兼容性和安全性的问题。Java技术在无线应用方面的优势非常明显:1. 应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。2. Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI);3. Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。基于以上分析,Java手机将是未来手机的发展方向,是业界的热点。2.3.1 J2ME架构J2ME架构的模块化设计使应用程序可以灵活适应小型计算设备的限制。J2ME架构没有替代小型计算设备的操作系统。相反,J2ME架构由位于原生
22、操作系统之上的多层软件组成,这些软件共同称为“连接有限设备配置”(Connected Limited Device Configuration, CLDC)。安装在操作系统之上的CLDC形成了小型计算设备的运行时环境。J2ME架构由3个软件层组成:第一层是包括在内的配置层,这个层次直接与原生操作系统进行交互。配置层还处理profile和JVM之间的交互。第二层是profile层,由小型计算设备的应用程序编程接口(API)的最小集合组成。第三层是Mobile Information Device Profile( MIDP )层。MIDP层由用户网络连接、永久存储和用户界面的java API组成
23、。它还能够访问CLDC库和MIDP库。2.3.2 JVM ( 虚拟机 )JVM是专门为微型电子设备与资源受限设备如:手机、寻呼机、移动互联网设备、家用微电子设备等设计的一种轻便、紧凑的JAVA虚拟机。JVM可以为微型电子设备提供一个完整的JAVA运行环境,除了一些微型设备所必需的适当的功能有所不同外,它是由JAVA虚拟机规范定义的真实的JAVA虚拟机。它是专门为那些受资源限制,只有几百K字节内存的微型设备设计的。JVM起初是由SUN微系统实验室为一个名叫“Spotless”的项目创建的。它的目标是为资源受限制的Palm(是目前较为流行的掌上电脑操作系统)可连接的电子设备,实现一个java虚拟机
24、。基于上述原因,JVM具有以下几个特点:(1)小,仅具有40KB至80KB的静态内存。(2)轻便、精巧。(3)模块化并可定制。(4)尽可能完全紧凑的完成设计目的。2.3.3 MIDP( 移动信息设备简表 )MIDP是专门为互联受限设备配置设计的,它为移动设备提供了一套API集合,MIDP包含用户界面类、持久存储功能与网络功能。它同时也包括一个供用户下载新应用到终端设备的标准运行环境。运行在MIDP下的小应用程序叫做MIDlet移动设备小应用程序,它与Applet类似。MIDP要求平台设备提供一个机制用来存储简单的数据记录,通过正常的平台事件,比如重新启动和电池更新维护系统的完整性。MIDP是以
25、SUN、Motorola、Nokia为中心的MIDPEG组织(Mobile Information Profile Expert Group)所制订出来使用在CLDC上的Profile,是以能使用在移动电话、双向对讲机、可无线通信的PDA(个人数字助理)上面为前提设计出来的。另外,像日本国内的NTT DoCoMo、J-PHONE、KDDI等电信商与移动电话制造商也都曾参与了MIDPEG。MIDP是在CLDC的功能上附加提供适合目标设备用的GUI与事件处理功能。这样一来,就可以当成MIDP应用程序(MIDlet)来运行了。MIDP由于是由多个企业所共同策划出来的开放标准,因此主要的移动电话制造商
26、也会制造出大量的对应机种。也就是说,以MIDP为基准所制作出来的应用程序,也将可以在流通于市面上的移动电话上执行。另外,MIDP不仅限于移动电话,也已经被移植到PDA Palm OS上,而以MIDP for Palm OS的名字来称呼(与KJava是不同的)。在不使用各电信商的扩展API的时候,制作给移动电话用的MIDlet也将可以使用在Palm OS上面。由于未来MIDP也将会搭载到不同设备之上,也由于其兼容性高,只要写过一次程序,就可以在其他移动电话或是移动电话以外的设备上执行;而这也就是它最大的好处。2.4 Java Appication Manager手机中负责调配程序运行资源的管理后
27、台是Java Application Manager。它所使用的传输媒体可以是红外线、网络、以及其他可用来传输的媒体。Java Application Manager 会从网络上下载代表该Application Suite 的JAR 档,接着在手机上安裝此MIDlet Suite,然后在手机开始执行该应用程序。整个详细的运作流程如图2-1所示。存储媒体手机内建浏览器JavaAppicationManagerKVM描述档图示档JAR档Java ServletHTML网页6安装应用程序8载入并执行应用程序使用者手机网站4.选择应用程序7.启动网络1浏览网页2.浏览描述档3.浏览图示5.下载图示和J
28、AR档图 2-1 JAM工作流程图3 需求分析、程序结构和相关技术3.1 本程序需解决的有关技术问题1.随着人们对一定阅读的需求增大,我们急需一款能满足人们日常阅读手机软件,既然阅读器面向的是普通消费者而不是计算机专家,那么他们不可能深入的学习使用技巧。保持程序操作的简易是最基本的要求。阅读器最基本的功能包括:载入图书、前进、后退、存档、读取书签,更换背景。2.用户运行阅读器时需要有书签记录的功能。这就需要进行适当的设计。记录书签的存储方式也需要有较好的解决方案。手机中由于处理器和内存空间、存储空间都十分有限,其数据库系统与普通PC大相径庭。其数据库结构较为简单,被称之为RMS系统。3.手机应
29、用程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。4.为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。5.程序的结束、开始、动态信息画面作为构成一个完美程序都是必不可少的重要部分。良好的用户界面更是吸
30、引用户的硬指标,相关的美术构图也需要有一定的考虑。6.Java是基于虚拟机的半解释型编译系统,其执行效率较C+等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。以上相关技术细节和整体流程将分别在以下小节阐述。3.2 程序流程MIDlet suite是MIDP应用程序的最小单位,JAM负责将手机内的MIDlet suite以图形化的方式呈现,让用户能够选取欲执行的MIDlet suite,一旦选取了某个MIDlet suite,操作系统就会激活KV
31、M执行里面的MIDlet。MIDlet及相关的支持类组成了MIDP应用程序的实际内容。消减状态(Destroyed)停止状态(Paused)运行状态(Active)StartApp()DestroyApp()呼叫MIDlet的构造函数DestroyApp()PauseApp()图 3-1 MIDlet的流程每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。在MIDP规格中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。这三种状态的
32、转换关系如上图所示:MIDlet的三个状态,pause、active和destroyed.在启动一个MIDlet的时候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。在active状态调用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。值得一提的是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,A
33、MS通知MIDlet进入destroyed状态。在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始运行后将先从外部文件载入背景图片文件,对背景的所有物体进行绘图。Logo 画面选项画面主程序屏幕绘图显示阅读进度显示GameOver显示历史书签表Ab
34、out开始初始化参数死亡时符合结束条件时图 3-2 本程序的主流程图3.3 Canvas类为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是Canvas抽象类进行绘图。从程序开发的观点看,Canvas类可与高级Screen类交互,程序可在需要时在Canvas中掺入高级类的组件。Canvas提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏
35、键布局。3.4 Graphics类Graphics类提供了简单的2D绘图功能。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用Graphics绘制,GameCanvas可调用getGraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给Canvas的paint()函数,以便最终显示。3.5 MIDP1.0技术下的绘制背景技术在没有MIDP2.0前,进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内将所想要画的图形画在一张预先准备好的背景上,等所有绘图操作都完成后再将背景的数据拷贝到实际的屏幕上
36、。Image类提供了一个建立背景的静态方法createImage(int width, int height),再利用getGraphics()方法取得属于这个背景的Graphics对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再调用drawImage()方法将背景的数据复制到实际显示的屏幕上。这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新画面的操作就是先将屏幕以fillRect()的方式清除,再将下一张图片画在屏幕上,然而反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在背景进行这个清除及重绘的操作,再将完成的绘
37、图拷贝到屏幕上,由于用户看不到清除的操作,因此就不会出现闪烁的现象了。不过在某些MIDP的实现上已经加上了双重缓冲的支持,因此在处理前应先利用Canvas类的isDoubleBuffer()方法来判断。3.6 MIDP2.0新增的GameCanvas包J2ME的流行促进几个运营商和制造商开发了一些支持游戏的类,但是,这却造成了游戏缺乏可移植性的问题,例如,很难将使用Siemens的Sprite类的游戏移植到Nokia上。在MIDP2.0版本发布后,这些游戏移植性问题初步得到了解决。MIDP2.0新加入了GameCanvas、Sprite、Layer、LayerManager、TiledLaye
38、r五个与游戏开发相关的类。其中 Layer类一般不会直接用到。Game类的出现不仅降低了错误出现的几率,也使游戏代码变的更小,因为开发者不需要自己编写象Sprite这种例子。下面将简要介绍Game类。GameCanvas类继承自Canvas,所以具有Canvas所具有的功能,还额外增加了一些便于游戏设计的功能。比如: GameCanvas类直接提供了getKeyStates(),使程序员可以在同一个线程自己侦测按键的状态。GameCanvas类提供了flushGraphics()的功能,实现了双缓冲技术。所谓的Sprite,就是画面上独立移动的图形。Sprite类是继承自Layer的用于存储多
39、桢的基本可视元素。不同的frame可交相显示,构成动态的效果。图片可翻转、颠倒、由一个主角图片就可以方便的得到所有方向的显示状态,相比原先只能使用Canvas绘图,需要将所有方向的主角图象都绘制在png图象中简化了许多。Sprite也可以从整合的图象中读图,读图时将把大图分解为若干等宽等高的小图。每个小图按照其排列顺序有相应的序号,在程序中调用其序号,就可以绘制出相应的图片。LayerManager提供控制整体画面层的控制。它包括了一系列自动获取了代号和位置的层,简化了各层加入游戏画面的过程,提供了自动排序和绘制的能力。LayerManager存储了一个层的列表,新的层可以用函数附加、删除和插
40、入。层的序号相当于坐标的Z轴,0层表示最接近用户视觉,层数越高,离用户越远。层号总是连续的,即使有中间的层被移除,其他层的序号会作相应的调整以保持整体的完整性。LM中的View Window控制着与LM相对坐标的可视区域。改变View Window的位置可以制造出滚动屏幕的效果。TiledLayer是有一组图象格元素组成的整块虚拟图象。该类使不需要高分辨率的图象就能创建大幅图面成为可能。这项技术通常应用在2D游戏平台的滚动背景的绘图。一块整图可被分割成等大小的图象格,每块格有其对应的序号,按照行列递增。多块小格可由大块同时替换组合而模拟动态的背景,这不需要逐块替换所有的静态图象格而显得非常方便
41、。3.7 PNG图片格式PNG(Portable Network Graphics)格式是MIDlet唯一支持的图象格式,PNG具体格式由PNG Specification,Version 1.0定义的。PNG格式提供透明背景的图象,这对绘制游戏画面和阅读效果极有帮助。PNG格式图片中包含许多定义其图片特性的冗余部分(Chunks)。这些代码包含在每一个单独的png格式图象中,然而如果将多个png图象合并在一张幅面稍大一些的整图中,多个chunks就可以得到精简,图片的大小可以得到控制。使用Image类中的createImage函数可从整图中分割出所需要的元素。在Game包中的TiledLay
42、er和Sprite类都整合了这样的功能。本程序中的地图元素都集成在一张beijing.png图片中,实现了方便的管理和程序体积的精简。3.8内存的优化手机内存空间小,所以在程序设计时应该注意以下几点,以尽量减少内存的使用: (1)尽量缩短命名的长度。在应用程序内,对于所建立的类、接口、方法及变量名而言,都需要赋予一个识别的名称,所命名的名称每多一个字符就会在类文件内多产生一个字节,对于一个较复杂的应用程序而言就会增加为数不小的数据量。所有这些可以借助混淆器来帮助实现 (2)所有代码写为一个类。 (3)只使用一个线程。 (4)尽量不使用静态变量。 (5)将PNG图片合并成一张,减少图形数据的大小
43、。将PNG格式的小分辨率图象合并在一张大的高分辨率图象中,由于减少了头文件的大小,将比合并前的总大小减少许多。3.9 内存检测器Wireless Tool Kit提供了许多在运行时监视运行状态的工具。 包括内存状况的检测(手机上的内存空间十分有限,必须时刻关注机载内存是否大于程序所能使用到的最大可能的内存空间),网络状况的检测,运行函数的跟踪等。 内存检测器是内存跟踪测试随时间变化的调试器。其中,允许强制垃圾回收(Garbage Collection)。由于Java语言中,不像许多其他的如C+语言,不需要指定回收函数中特定不使用的资源,资源回收机制将自动清空无效变量占用的空间。在程序运行中也可
44、以调用System类的gc()函数手动收回废弃的内存。3.10 关于混淆器Java 语言并没有完全编译成二进制可执行文件,编译出的.class文件是一种介于源程序和二进制之间的一中基于半解释的字节码,需要虚拟机来执行。它包括了所有的信息。然而这样会导致.class很容易被反编译为源代码,从而不能保护作者的知识成果。目前流行的如decode,JAD等反编译工具可以以很快的速度生成源文件。如果不加以施行有效的措施,将造成严重的后果。由此引入混淆器的概念。混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,如果缺乏相应的函数名指示和程序注释,即使被反编译,也将难以阅读。混淆器的作用不仅仅
45、是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的减少变量、函数的命名长度的关系,编译后也会从.class文件中减少这些冗余的信息。混淆后,体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。4 程序分析和具体实现4.1 手机阅读器读取文本由于J2ME不可以对手机中的文件进行读写,所以在开发本程序时,只能在程序打包时把文本文件作为资源文件加入到J2ME发布程序中。如果想读写手机上的文件,则要使用各手机商家提供的特定开发平台和专用的类来开发,下面就文本阅读器的关键技术进行说明。在J2ME中如何读取文本文件的内容,在本系统中写了一个函数用来读取指定的文本文件,文本文件做为参
46、数传给该函数,该函数的返回值为字符串类型,将文件的内容做为一个完整的字符串返回。在读取文件内容时用到的主要技术,使用InputStream类定义一个输入字节流对象in,使用ByteArrayOutputStream类定义一个内存数组输出字节流对象s,通过输入对象的in.read()方法来读取一个字节,将读出的字节通过s.write( )方法加入到s中,再使用s.toString()方法将内存转为字符串返回。读取文本文件的函数定义如下: private String myReadLine (String testFileName) /函数头定义了函数的参数为文件名组成的字符串,返回值为一个字符串
47、。 InputStream in = this.getClass().getResourceAsStream(testFileName); /由文件名参数来定义一个输入流对象变量in ByteArrayOutputStream s; s = new ByteArrayOutputStream(); /产生内存数组输出字节流对象变量S try int ch=0; ch=in.read(); /由输入流对象变量in的read方法以字节为单位来读取文件的内容,读取到文件尾时的值为-1。 while ( ch!= -1 ) /如果未读到文件尾把读取的内容写入S变量中,并读取下一字节内容 s.write( ch );