站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题J2ME中的事件处理

J2ME中的事件处理

摘要: J2ME中的事件处理
<tr><td>
http:///tech/article1526.html
译者:Rocks
译者按:下面翻译自MIDP2.0 API文档,希望有助于大家理解MIDlet的运行机制。


用户的交互产生事件,然后MIDP实现把这些事件采用对应的回调方法来通知应用程序。有四大类UI回调方法:

* 抽象的命令,这是高层界面API的一部分
* 单个按键按下和释放的底层事件(如果触摸点设备可用的话,那么还包括触摸点事件)
* 回调Canvas类的paint()方法
[]* 由Display类的callSerially()方法引发的,对Runnable.run()方法的回调

所有的UI回调方法都是序列化的,所以它们绝不会并行发生。也就是,任何MIDP实现都不能在前一个回调未返回的情况下调用另外一个回调。这个性质确保了当一个事件发出的时候,它的前一个事件肯定已经处理完成。如果有多个未处理的UI回调,那么只要前一个UI回调返回了,下一个就会紧接着被调用。MIDP实现同时也要保证,使用callSerially()方法引发的run()方法要在所有未处理的repaint请求都得到满足之后才被调用。

但在回调的序列规则中有一个特例,就是当Canvas.serviceRepaint()方法被调用的时候。这个方法导致Canvas.paint()方法被立即调用,并会等待直到该方法运行结束。即使serviceRepaint的调用者本身就在一个回调中也一样。以后会对这个问题进一步讨论。

下面这些回调方法都是序列化执行的:

Canvas.hideNotify
Canvas.keyPressed
Canvas.keyRepeated
Canvas.keyReleased
Canvas.paint
Canvas.pointerDragged
Canvas.pointerPressed
Canvas.pointerReleased
Canvas.showNotify
Canvas.sizeChanged
[]CommandListener.commandAction
CustomItem.getMinContentHeight
CustomItem.getMinContentWidth
CustomItem.getPrefContentHeight
[]CustomItem.getPrefContentWidth
[]CustomItem.hideNotify
CustomItem.keyPressed
CustomItem.keyRepeated
CustomItem.keyReleased
CustomItem.paint
CustomItem.pointerDragged
CustomItem.pointerPressed
CustomItem.pointerReleased
CustomItem.showNotify
CustomItem.sizeChanged
CustomItem.traverse
CustomItem.traverseOut
Displayable.sizeChanged
ItemCommandListener.commandAction
ItemStateListener.itemStateChanged
[]由Display.callSerially引发的Runnable.run

记住定时器(Timer)事件并非UI事件,定时器的回调方法是可以和UI事件回调方法同时调用的,不过同一个Timer对象中的多个TimerTask则是序列化调用的。如果应用程序使用了定时器,那么当定时器事件回调和UI事件回调同时发生时,应用程序必须自己确保其数据结构的安全。应用程序也可以选择使用Display.callSerially()方法来把定时器事件序列化到UI事件队列中去以避免同步问题。
http:///tech/article1526.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: 保护您的 J2ME/MIDP 应用程序
后一篇: 解决Java程序在MOTO E680i中声音文件播放