我正在尝试使用Apache SCXML为Java应用程序定义一个状态机。然而,我遇到了一个问题,我不确定这是由于SCXML框架还是我做错了什么。
我将我的测试应用程序基于以下示例(没有android位):
http://commons.apache.org/scxml/usecases/scxml-stopwatch-on-android.html
文件StopWatch.java (http://commons.apache.org/scxml/xref-test/org/apache/commons/scxml/env/StopWatch.html)
public class StopWatch extends AbstractStateMachine {
public void reset() {
}
public void running() {
}
public void paused() {
}
public void stopped() {
}
}问题是上述状态在每个转换中只被调用一次。这是正确的吗?只要状态机保持给定的状态,就不应该连续调用状态函数吗?
谢谢!
发布于 2011-02-17 07:04:49
嗨,只是为了防止其他人发现这个问题。
上面的示例仅在定义的state machine示例的上下文中有效。
状态不会自动转换,因为它们受到事件的保护。因此,只有当状态机处于状态A并且触发了定义的转换事件时,状态机才会前进。这可以在下面的代码片段中看到
<state id="reset">
<transition event="watch.start" target="running"/>
</state>作为补充说明,与StopWatch示例中定义的状态同名的方法的执行由AbstractStateMachine本身中定义的EventListener保护。作为initialize方法的一部分,注册一个新的侦听器。
engine.addListener(stateMachine, new EntryListener());此监听器调用具有新状态的相应状态名称onEntry的方法
public void onEntry(final TransitionTarget entered) {
invoke(entered.getId());
}因此,如果希望连续调用状态,只需删除状态机(SCXML)描述中的转换保护。
发布于 2009-09-11 19:54:59
为什么你会期望这种行为呢?您的状态类只需要知道转换。一旦你转变了,你就处于一个稳定的状态。
发布于 2015-11-28 10:15:46
你误解了状态机的行为。状态的本质是,在某些情况下,状态机对象将满足某些条件来执行某些活动或等待某些事件。当然,你可以通过在秒表类的函数中定义循环来描述,但是有什么意义吗?运行的函数有一个计时器线程,一个计时器任务可以被视为一个循环,不是吗?运行状态执行线程任务,并等待事件退出此状态并停止任务。
https://stackoverflow.com/questions/1410539
复制相似问题