急,不同的模拟器为什么出现不同的结果?

hanzsim 2008-08-06 09:18:50
刚编写好一个小游戏,在MIDlet类内部自定义了Message内部类。在MIDlet的startApp方法里,创建了一个Message对象,并对它调用Display的setCurrent方法,再调用这个Message对象的setFullScreenMode方法。在这个过程中,不同的模拟器出现了不同的结果。三星的能执行,SUN的能执行,诺基亚的S40在执行时却出现NullPointerException。经加断点单步执行,发现问题就在于创建对象上,应该是调用了构造函数在创建对象后,对象并没有立刻创建出来,主线程不等对象创建完毕就调用了新创建对象的方法,结果产生了这个异常。如果断点设置在调用方法前,哪怕代码不做任何改变,过一小会后再继续执行的话,就能正常执行了。应该是其它线程创建对象已经完成了,就能正常执行。这个问题怎么解决?
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanzsim 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cacalv 的回复:]
加一个判断行不行?
if(对象!=null)
{
线程.start();
}
[/Quote]
不行的。这个方法已经试过了。
我现在已经解决了,感谢大家的参与帮助。
根本原因在于几种模拟器的实现差别。
最标准的是Sun的模拟器。没有任何问题,其它的模拟器S40好一些,而MOTO三星次之。
几种模拟器对Canvas的setFullScreenMode事件实现上有差别。Sun在调用了setFullScreenMode后,立刻引发sizeChanged事件;而其它手机则是先引发paint事件,而后才出现sizeChanged事件。而往往取得字体、根据屏幕大小设置绘图位置等需要先知道屏幕大小才能操作的,先出现paint就全影响程序的运行。并且,Sun和诺基亚模拟器不设置Display的setCurrent也可以调用setFullScreenMode的!
最后解决是,在paint中使用try...catch...捕获异常,如果已经出现过sizeChanged,则有关绘图参数都已经设置好了,不会出现异常;如果未出现,将此异常在paint内部消化,并不实际绘图。这样先出现sizeChanged还是paint就不影响了。另外,为保证每款手机都能正常工作,务必先对Display调用setCurrent,再调用Canvas的setFullScreenMode就没有问题了。
bianmazi 2008-08-19
  • 打赏
  • 举报
回复
贴出点代码看看.
cacalv 2008-08-19
  • 打赏
  • 举报
回复
加一个判断行不行?
if(对象!=null)
{
线程.start();
}
hanzsim 2008-08-07
  • 打赏
  • 举报
回复
我想过这个方法,可中间还有条语句:display.setCurrent(msg);如果把它们都放在Message类的构造函数里,会影响主线程对Displayable的调度的。不能单独把setFullScreenMode移过去的,因为三星的模拟器如果Displayable不是可视的话,不会激发sizeChanged事件,而这个事件又是我必须要用到的。因此,必须先setCurrent,后setFullScreenMode。现在是诺基亚的先主线程,后创建对象;而三星和Sun的是先创建对象,后主线程。
hanzsim 2008-08-07
  • 打赏
  • 举报
回复
高手们快来帮帮忙啊。困扰我两天了。
贝壳鱼 2008-08-06
  • 打赏
  • 举报
回复
你是这样吗:

Message msg = new Message();
msg.setFullScreenmode(true);

你如果把setFullScreenMode放到Message的构造器里呢? 我觉得在真机上应该没这种问题。

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧