作 为一个J2ME手机开发的铁杆鼓吹手,我一直都在不遗余力的向周围有志于移动应用领域开发的朋友们宣传MIDP并且推荐王先生的著作。J可想而知,当我拿 到王先生的新作《Java手机_PDA程序设计入门》电子版时心中的欣喜和激动。可是当得知要为王先生的这部新著撰写书评的任务时,也同时感到了压力和不 安。如果真的要让我来写这个东西,我很可能会把它写成一篇读书笔记或是读后感,如果让我给写好的这篇东西加个期望的话,我希望是能给更多的手机应用开发的 朋友们带来一点帮助吧!
细细的读完了这本书,掩卷长思,的确受益匪浅。我把《Java手机程序入门及应用》比作一道java口味的清淡爽 口小菜,那么<
全书总共分成以下几个大部分来介绍J2ME的知识:1.J2ME背景的介绍和开发的环境;
2.J2ME 开发的基础知识,包括生命周期,开发工具的选择,高级用户接口API,低级用户接口API等;3.详细地介绍了J2ME开发的进阶,其中包括了Game API的开发知识,数据库的开发,通用的连接框架以及如何开发与企业系统的衔接等;4.概要的介绍了其他的各种不同的手机平台开发工具配置流程,包括 Personel Java,Pocket PC以及Symbian等等。这本书涵盖的知识面非常的广。很多在《Java手机程序入门及应用》一书中不是太清楚的概念,在这里都作了澄清,我们可以更 好地把它看作是一本进阶的教程。但是如果作为初学者,我建议还是应该先看看《Java手机程序入门及应用》,然后再看本书也许将会有更大的收获。
出 于经验和所关注知识层面各方面的原因所限,我无法像通常的书评一样从市场,从全局,从大处来把握评价这本书。我只能依据自身的开发经验,平时在网上在论坛 上与朋友所讨论开发中所存在的问题以及从我所关注本书的某些细节方面出发,来和大家一起来分享这道盛宴。我就从一个手机Java的程序员的角度坦率的说说 这本书将能给我们带来的好处。
1)关于此书,我以前在网上就浏览过它相关Game API章节的电子版。早就心向往之,今日终于可以一窥端倪。本书的知识结构都是相基于MIDP2.0规范的,这一点须请读者特别留心,在测试书中的实例的 时候应该使用WTK2.0 或者 WTK 2.1工具,虽然当前有些扩充的API能够实现的手机不多,但是这是未来J2ME的发展方向,这也是作者立意深远之处。“工欲善其事,必先利其器”, WTK本身就是一个很好的编译模拟打包的集成工具,但是相对于MIDP的不同版本,也给我们开发工作带来过很多困扰。笔者曾经在论坛上碰到过这样的例子: 不少的朋友的编译打包后的jad,jar文件无法在手机上安装,原因就在于MIDP的版本问题。本书中说明了三种标准的开发版本,即MIDP1.0, JTWI,MIDP2.0,并且说明WTK2.1就能够开发兼容与三种不同规格的应用程序,还能视自己的需求调整环境。这样,我们可以通过统一的 WTK2.1来开发我们的****了。
2)在国内系统而全面的介绍JCP标准化组织和JSR接口规范以及相关的J2ME发展背景的书籍资 料不多,而本书的作者花费了很长的篇幅来介绍这一背景和发展方向。如同各种Sun所展现的Java技术,J2ME的每种相关的技术都经过由一定的步骤来制 定,这个过程就是JCP。Expert Group遵循JCP所制定的准则来制定各种Java规范(JSR)。还有相关的参考实现(RI)和兼容测试包(TCK)。对JSR标准等相关的背景知识 的详细了解可以更有助于我们更加清楚的把握J2ME发展的整体结构和方向。
3) 有很多的技术细节,也许都是我们时所忽略的。比如,在网上有不少的朋友都在问我,midlet小程序是否所能够访问外部文件的问题,在这里也能够找到了解 答,在Midlet中只能存取来自同一个jar文件中所有非class的资源文件,当然,RMS也是资源的一种。这主要是从手机系统的安全角度来考虑的, 包括图片,文本在内jar中所有的资源文件我们都可以通过 java.lang.Class.getResourceAsStream()函数来访问,这些也都是书中所提到的。
4)在Midlet 的生命周期状态的流程分析中,有很多的细节也是我们平时也许并没有注意到的。比如说,在程序的生命周期中startApp()函数很可能不仅仅只被调用一 次,而是每次从停止状态到启动状态的时候都会被调用,所以我们如果有些只需要初始化一次的代码就不要放在startApp()而是在构造函数中,并且尽量 不要在startApp()做过多的初始化动作。以及它所抛出的异常的处理流程,这些都是值得注意的,这本书告诉我们,程序的许多效率的提高,其根源也许 就在于这些林林总总的细节问题。
5)作为开发嵌入式应用系统软件,程序的运行效率是致命的关键。本书中的许多地方都着重的提及了这一点, 并且举出了例子来帮助我们来改善这方面的问题。其中当然包括了许多经典的范例,包括循环问题的处理,在处理循环问题中需要将一些不必要的操作步骤移出循环 体外,可以大大地增强程序的效率。还有在String与StringBuffer使用效率的比较的时候因为String作为一个包装好的类,在处理字符串 的时候会多出很多的开销,相比之下简单的字符串处理可以完全的考虑StringBuffer类来进行。当然线程也是影响程序运行效率的一个关键性的要素, 线程引入游戏开发的一个很重要的方面就在于屏幕在同时绘制一段动画的同时,界面仍然能够响应用户的录入,也就是用户的低级事件。同时,在用户界面层中,无 论是高级的界面API,还是低级的界面API,线程的使用都扮演了很重要的角色,必须考虑到所有UI相关的回调函数都是由同一个Thread所完成的。我 们在处理多线程的应用的时候,一定要考虑到线程的相关特性,小心谨慎。
6)在论坛上有很多的开发者为这个问题所困扰,为什么一个游戏的动 画程序在模拟器上表现正常但是却在某些设备上总是出问题呢?这是因为每当屏幕需要重绘的时候(有人调用repaint()或者是系统需要),就会在消息队 列中塞入一个重绘事件,等到处理UI的线程有时间的时候,就会自动从队列中抓取事件,然后调用paint()回调函数。由于在处理UI线程处理前,很可能 很多的重绘事件被塞入队列中,有些KVM为了做出最佳化,往往会将很多的paint()合而为一,同时减少paint()的调用次数。所以在运算资源紧张 的时候,许多重绘的事件将会被丢弃,导致屏幕看起来像是跳格。这也正是许多人开发的****中的动画效果为什么明明在某些的模拟器和设备中表现良好,却在 某些的设备中却频繁出现失真,定格以及滞后等问题的根源。解决的方法就是调用完repaint()方法后,紧接着就立刻调用 serviceRepaints()来强制重绘,尤其是在某些动感要求极强的游戏中,但是serviceRepaints()会等到paint()完成以 后才返回,所以对效能上有很大的影响,这是需要仔细斟酌的。这也是本书所特意提到解决方案。大概是“于细微处见精神” 吧,在书中的许多的细节之处,的确能够看到作者的治学严谨,匠心独运。
7)在本书关于游戏界面的控制的一些概念,移动的通讯设备的本身都 是多种硬件加上多种操作系统的综合体,每家厂商均有各种特殊的用户界面,如果要保证MIDP应用程序的跨平台性,程序员需要多方面的考虑,比如按键在屏幕 上的布局,根据我们所选择的类型就有不同的表现。本文详细的分析了MIDP系统的 midp2.0,并且加重了UI高级控件的界面布局,同时也增加了很多相关于调整界面布局的内容。例如,记得在论坛上也有朋友问过我为什么 g.drawstring(“Hello”,0,0,g.BOTTOM|g.HCENTER); 代码无效。其实(0,0)坐标为字符串或图形绘出在屏幕上时中下方的位置,如果使用了这样的函数调用,屏幕上将无法看到任何的东西了,因为都画到了屏幕之 外。这些都是需要在阅读本书的时候细细的体会才能考虑得到。
8)本书关于一些高级的MIDP开发应用的介绍,包括Game API的开发,连接通用框架的使用,企业级应用的集成等,都是国内同等技术书籍中不多见的。本文在Game API的篇章中详细地介绍了组成Game API的各种重要的对象概念,并且给出了实际的标准范例,帮助读者更加深入地了解到了Game API的技术细节。
9)本书虽然在许多的 方面细致入微的分析J2ME的方方面面,但是也有其疏漏之处,其中比较重要的就是在于中文字符的显示问题了。这也是在相关技术论坛上讨论的一个焦点问题。 其中手机里面的字符串基本上都是采用的UTF-8的编码法,这种编码的格式介于ASCII和unicode编码法之间,经常碰到的中文问题主要分为以下几 种:
1.rms数据库读写的问题;
2.在jad中书写游戏中文名称并且显示;
3.网络传输中中文问题(kxml传输的解码);
4.部分的模拟器也不支持中文(比如Nokia 60系列模拟器)。
解 决第一个问题就是利用writeUTF() 和 readUTF()函数接口,他们提供了一个由从Unicode到UTF-8的相互转化的途径。第二个问题,建议还是自己手工用文本工具转化成UTF-8 的编码写在上面,否则你用unicode码制写入中文的话,在模拟器或者实际设备上就有无法识别而导致程序不能执行的危险。第三个问题在于不同的手机其实 支持的默认码制也是不一样的,CLDC的系统属性"microedition.encoding"定义了设备的默认字符编码,它的值可以使用 System.getProperty方法取得。我们也可以转化成相关的支持的编码机制来实际的运行我们的程序。最后一个问题,主要都是集中在Nokia 60系列模拟器上,那真的没有办法了,要么只有等待他的中文版本出来了,要么可以考虑在文字的部分可以使用贴图在代替。
虽然我所关注的也许仅仅只是细节末枝,林林总总不入大雅之堂,但是我也希望能够管中窥豹,帮助大家能够一睹王先生在新著所带给我们的Java世界。总之,看完了这本书,使我更加期待下一部的
我认为一款好的游戏就像电影,不仅仅只在于画面精美,动作流畅,情节动人等等,关键在于,是否能够触动你的心灵...