我正在尝试使用 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() {
}
}
问题是上述状态每次转换仅调用一次。它是否正确?只要状态机保持在给定状态,状态函数不就应该被连续调用吗?
谢谢!
最佳答案
您好,以防万一其他人发现这个问题。
上面的示例仅适用于定义的 state machine 的上下文中示例。
状态不会自动转换,因为它们受到事件的保护。因此,只有当状态机处于状态 A 并且定义的转换事件被触发时,状态机才会前进。这可以在下面的代码片段中看到
<state id="reset">
<transition event="watch.start" target="running"/>
</state>
作为补充说明,与 StopWatch
示例中定义的状态同名的方法的执行由 AbstractStateMachine
本身中定义的 EventListener 保护。
作为初始化方法的一部分,注册了一个新的监听器。
engine.addListener(stateMachine, new EntryListener());
该监听器调用对应状态名称onEntry的方法进入新状态
public void onEntry(final TransitionTarget entered) {
invoke(entered.getId());
}
因此,如果您希望连续调用状态,只需删除状态机(SCXML)描述中的转换防护即可。
关于java - Apache Commons SCXML 状态机框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410539/