由 nokia 官方一个失败的 demo 所总结到的

来源:互联网 发布:亚马逊跟卖软件 编辑:程序博客网 时间:2024/05/17 02:30

 由 nokia 官方一个失败的 demo 所总结到的

        首先我们来确认一下:nokia N72 属于 S60 平台系列(http://www.forum.nokia.com/devices/N72/)。而 nokia N72 不支持 JSR179。可以用以下代码判断手机支持不支持 JSR179:


        在 nokia N72 上运行这段代码,返回的结果为 false。
        然后我们来看一下 JSR179 主要倡导者 nokia 的关于 JSR179 的开发指南 MIDP_Location_API_Developers_Guide_v2_0_en.pdf (本文件已经上传至作者的 csdn 资源)中有一个 Tourist Route demo(本 demo 也已经上传至作者的 csdn 资源),如下图所示:

************************************下面是 nokia 官方文档截图部分**************************************
nokia 官方文档截图
************************************上面是 nokia 官方文档截图部分 **************************************
        指南中说此 demo 程序在 Series 40 平台不能运行,但是支持 S60 平台。也就是说 nokia N72 可以运行这个 demo。
        但是这个 demo 确实是不能运行在 N72 上的。这不是因为 N72 不支持 JSR179,demo 中有关于支持不支持 JSR179 的判断,并且有对不支持 JSR179 的相关操作,下面是 demo 的 TouristMIDlet 类中相关源代码:


        也就是说这个 demo 不仅针对支持 JSR179 的 S60 平台机型,而且针对不支持 JSR179 的 S60 平台机型。但它为什么不能运行在 N72 上呢?下面是 demo 中 ConfigurationProvider 类的相关源代码:


        javax.microedition.location.Criteria 是 JSR179 中定义的用于选择服务供应商的类,而他这里竟然将 Criteria 类型的 freeCriterias 定义为 static 变量!聪明的你一定也知道为什么这个 demo 不能运行在 N72 平台上了吧。对,正如你所想到的,对于static变量和程序块,是在类加载时被加载的,只能初始化一次。对于没有 JSR179 接口的 N72 在加载这个 demo 的时候却找不着这个类,当然不会继续运行这个程序!
        nokia 官方大概只在支持 JSR179 的机型上测试了一下这个 demo,就把它公布出来了,而且还作为 JSR179 用户指南的主要示例程序。应该说这是一个失败的 demo。虽然他确实起到了 JSR179 示例的作用,但他同时也误导了开发人员,因为开发人员的程序可能不仅仅运行在支持 JSR179 的 S60 平台机型,而且考虑到程序的移植性也可能运行在不支持 JSR179 的 S60 平台机型。作为 JSR179 的倡导者,nokia 不应该犯这种低级错误。
        我们 JavaME 手机地图研发小组在进行手机自动定位时,也曾犯过一个类似的错误。我们把判断真机是否支持 JSR179 的代码,以及获取经纬度的代码都封装在了一个叫做 LocationTool 的类里了:


        在 MIDlet 程序中需要判断真机是否支持 JSR179,结果就把这个 LocationTool 给实例化,然后调用它的 judgeJsr179 方法。这下可惨了:SUN 的模拟器默认支持 JSR179,我们的模拟器无法模拟不支持 JSR179 的机型,而我们程序的第一个真机测试机型就是 nokia N72。结果程序死活运行不起来!大家快疯了,用了一下午的时间来查这个问题,从 MIDlet 部署,打包,到对 JSR179 文档的怀疑。最后还是请教了一下资深移动开发人员,终于找出了问题所在。
        作者总结:不要盲目相信,依赖任何权威,想当然的东西有时也会未必然。JavaME 开发一切要以真机为基准。对于 JSR179,JSR135 等由第三方所倡导,公布的标准,相关接口使用的时候一定要慎重:在不确定真机是否支持的时候不要将依赖于相关接口的类进行实例化;判断真机是否支持相关 API 的代码也尽量不要写进依赖于相关接口的类中。