一.中文乱码问题
任何乱码问题,都可以通过保存和读取采用一致的编码来解决。由于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) 一般来说手机中断时会调midlet的pauseApp()的,然后回来会调startApp(),这样就可以在这两个函数中进行中断的处理。
2) 但有些手机其实不会去调用pauseApp(),而是在中断时调用Canvas的hideNotify(),在中断返回时(当然包括启动时)会调用Canvas的showNotify(),中断处理便可以放在这两个函数中。
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程序,中断的时候会调用midlet的pauseApp(),输入完成后调用midlet的startApp()恢复程序。而我在startApp()中做了其它操作,因此输入完成后一直无法正确返回。我还曾一度怀疑是我的TextField使用错误。后来在startApp()中加了一个判断语句才解决这个问题。因此为了移植性起见最好在这方面注意一下。
三.资源分配与回收
由于手机上的开发,是内存受限的。因此要特别注意资源分配和回收。不能随便大量的创建对象。特别要注意的是使用图像的时候也不能够读取以后,就不释放内存。在调试真心话大冒险的时候,在我的手机上一度无法启动,开始我还以为采用了一些不合法的API,经过我反复测试,不断删减代码,才发现是由于一次把所有的图片都读取到内存中,造成内存不够,而无法启动。后来把程序改成按需启动,使用完后释放的策略才解决这个问题。想想以前在诺基亚手机上使用,速度慢,以及用着用着突然死机,也许是这个问题吧。
四.文件的使用
一般的手机上J2ME是不支持,直接读写文件的。但是大部分支持,读取jar /res/下的文件。为了达到更大的可移植性,可以采用在jar /res/中存放一些初始的配置文件。而程序在运行的过程中所产生的一些配置,可以保存在RMS中。
五.文字大小
不同手机里J2ME大小是不同的,在我MTK手机里文字较大,而在诺基亚里文字较小。既然文字大小不等,那我们还是将它看成变量。Font类有两个方法:getHeight和stringWidth可以帮助我们。如果你的游戏里只使用一种字体,那么只要开始时调用一下getHeight,将字体高度记录下来就可以了。当然要记得在paint里面setFont啊!
六.屏幕大小不一样
屏幕尺寸不等?把它看做变量!不同牌子不同型号的手机,屏幕尺寸大小不一。在渲染时必须考虑到尺寸的变化,即将尺寸看成两个变量 ScreenWidth和ScreenHeight,将这两个变量代入到渲染时坐标的计算式中。这样屏幕尺寸变了,但想要的效果不会变。举个简单的例子,现在想居中绘制一个Logo图,只要设置渲染的坐标为: x=(ScreenWidth-ImageWidth)/2; y=(ScreenHeight-ImageHeight)/2即可。
七.按键问题
J2ME标准api中Canvas中定义的键值有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。