j2me可移植性总结

一.中文乱码问题

任何乱码问题,都可以通过保存和读取采用一致的编码来解决。由于UTF-8在手机中广泛支持,所以采用UTF-8编码。

1.       文件

文件保存的时候,采用UltraEdit保存为UTF-8格式。读取的时候采用UTF-8格式读取。

InputStream in = null;

DataInputStream dis = null;

Object obj = new Object();

int count = 0;

 

       in = obj.getClass().getResourceAsStream(fileName);

       dis = new DataInputStream(in);

       try {

           count = dis.available();

            data = new byte[count];

dis.read(data);

dis.close();

 

       } catch (IOException e2) {

           // TODO Auto-generated catch block

           e2.printStackTrace();

       }

      

       String names = null;

       try {

           names = new String(data,"UTF-8");

       } catch (UnsupportedEncodingException e1) {

           // TODO Auto-generated catch block

          

}

 

2.  RMS乱码解决

保存的时候采用UTF-8读取的时候采用UTF-8

保存

RecordStore  rs = RecordStore.openRecordStore(“record”,true);

String  str =  new String(“测试”);

 

Try{

Byte[]  data  =  str.getBytes(“UTF-8”);

Rs.setRecord(1,data,0,data.length);

}catch(Exception  e){

}

读取

RecordStore  rs  = RecordStore.openRecordStore(“record”,true);

byte [] data =new byte[1024];

data =  rs.getRecord(1);

String  str  =  new String(data,”UTF-8”);

 

 

二.中断处理

手机的中断事件一般就是来电话、短信或是按手机上的红键,理论上来说这些事件一但产生手机便会调用中断处理。但实际上每个不同产商的手机都会有些许不同的地方。
    1)
一般来说手机中断时会调midletpauseApp()的,然后回来会调startApp(),这样就可以在这两个函数中进行中断的处理。
    2)
但有些手机其实不会去调用pauseApp(),而是在中断时调用CanvashideNotify(),在中断返回时(当然包括启动时)会调用CanvasshowNotify(),中断处理便可以放在这两个函数中。
    3)
当然还有一些手机更牛,上面的两种情况都不调用,这时就可使用公司称为软中断的东西了。所谓的软中断,其实就是在程序中判断程序一次循环的间隔时间,如超过某设定值(一般都是3秒)就调用中断处理函数。

      if (System.currentTimeMillis() - s_previousTime > cDef.k_virtual_interrupt_time)
            {
                hideNotify();
                showNotify();
            }
         s_previousTime = System.currentTimeMillis();   
   4)
冒似还有一些更神奇的手机,中断调用的顺序是乱来的。有可能先调showNotify反回调hideNotify,而且有可能还不只一次。遇到这些手机,大家可以在真机上测试,把每个中断处理函数的调用次数顺序打印出来分析。

PS:今天调试真心话大冒险的时候,发现在MTK手机平台上在TextField里输入文字的时候,也是一个中断。由于J2ME程序要使用手机自带的输入法,要中断J2ME程序,中断的时候会调用midletpauseApp(),输入完成后调用midletstartApp()恢复程序。而我在startApp()中做了其它操作,因此输入完成后一直无法正确返回。我还曾一度怀疑是我的TextField使用错误。后来在startApp()中加了一个判断语句才解决这个问题。因此为了移植性起见最好在这方面注意一下。

 

三.资源分配与回收

由于手机上的开发,是内存受限的。因此要特别注意资源分配和回收。不能随便大量的创建对象。特别要注意的是使用图像的时候也不能够读取以后,就不释放内存。在调试真心话大冒险的时候,在我的手机上一度无法启动,开始我还以为采用了一些不合法的API,经过我反复测试,不断删减代码,才发现是由于一次把所有的图片都读取到内存中,造成内存不够,而无法启动。后来把程序改成按需启动,使用完后释放的策略才解决这个问题。想想以前在诺基亚手机上使用,速度慢,以及用着用着突然死机,也许是这个问题吧。

 

四.文件的使用

一般的手机上J2ME是不支持,直接读写文件的。但是大部分支持,读取jar /res/下的文件。为了达到更大的可移植性,可以采用在jar /res/中存放一些初始的配置文件。而程序在运行的过程中所产生的一些配置,可以保存在RMS中。

 

五.文字大小

不同手机里J2ME大小是不同的,在我MTK手机里文字较大,而在诺基亚里文字较小。既然文字大小不等,那我们还是将它看成变量。Font类有两个方法:getHeightstringWidth可以帮助我们。如果你的游戏里只使用一种字体,那么只要开始时调用一下getHeight,将字体高度记录下来就可以了。当然要记得在paint里面setFont啊!

 

六.屏幕大小不一样

屏幕尺寸不等?把它看做变量!不同牌子不同型号的手机,屏幕尺寸大小不一。在渲染时必须考虑到尺寸的变化,即将尺寸看成两个变量 ScreenWidthScreenHeight,将这两个变量代入到渲染时坐标的计算式中。这样屏幕尺寸变了,但想要的效果不会变。举个简单的例子,现在想居中绘制一个Logo图,只要设置渲染的坐标为: x=(ScreenWidth-ImageWidth)/2; y=(ScreenHeight-ImageHeight)/2即可。

 

七.按键问题

J2ME标准apiCanvas中定义的键值有17(方向、确定、#*、数字键) + 4(游戏键) = 21个。在一般的手机中,这缺少了/右功能键“C,由于这三个键在标准api中并未给出,所以不同的手机厂商对其的支持也不同。

手机平台

左功能键

右功能键

C

Nokia

-6

-7

-8

Moto

-21

-22

-8

SonyEricsson

-6

-7

-8

Samsung

-6

-7

-8

Sun Emulator

-6

-7

-8

 

 

 

 

 

 

 

 

 

八.运行速度

    运行速度也是一个值得考虑的问题,毕竟手机运行速度是有限的。在写程序的时候,有些程序并不注意。特别是不明白一个调用一个函数会带来多大开销,以及它运行的原理,以及可能带来的运行效果。这里不再详细说明。性能优化可以参考一下这篇文章http://hi.baidu.com/wch20088082008/blog/item/6b2cad35109ed7bfd0a2d3ea.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值