译者: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事件队列中去以避免同步问题。