StateMachine学习
Posted 爱吃香蕉的猴子0000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StateMachine学习相关的知识,希望对你有一定的参考价值。
Hello, 大家好,我是爱吃香蕉的猴子,写一下 学习的StateMachine;
StateMachine使用addState来构建一个StateMachine的树结构,另外通过setInitialState方法设置指定初始状态,之后通过start来启动该StateMachine,从根状态到初始状态路径下的的所有状态的enter方法首先得以执行;
消息处理:
- 当前StateMachine初始化完成以后,通过obtainMessage和sendMessage获取和发送消息,收到消息以后,首先是当前所处状态的processMessage执行,以上例子,就是ms1,另外ms1也可以通过transitionTo切换到新的状态,
需要注意的是,transitionTo并不能立刻切换到新状态 - 如果当前的所处的状态机不能处理消息,则在processMessage方法返回false,此时由其父状态来处理
- 通过transitionTo切换到新的状态机时候,沿着当前的状态机到需要切换到的目的状态机的共同父状态依次的exit方法,然后顺着共同父亲状态依次执行新的状态机的enter方法(需要注意的是,公共父状态的enter和exit方法不会执行)
- 如果想要停止状态机,可以调用quit或者abort方法,从而进入QuittingState,并在下一次处理时,退出HandlerThread线程,清理内部各个对象。
例子:
增加源码:
core/java/com/android/internal/util/StateMachine.java
./core/java/com/android/internal/util/IState.java
./core/java/com/android/internal/util/State.java
class HelloWorld extends StateMachine {
HelloWorld(String name) {
super(name);
addState(mState1);
setInitialState(mState1);
}
public static HelloWorld makeHelloWorld() {
HelloWorld hw = new HelloWorld("hw");
hw.start();
return hw;
}
class State1 extends State {
public boolean processMessage(Message message) {
log("Hello World");
return HANDLED;
}
}
State1 mState1 = new State1();
void testHelloWorld() {
HelloWorld hw = makeHelloWorld();
hw.sendMessage(hw.obtainMessage());
}
}
以上是关于StateMachine学习的主要内容,如果未能解决你的问题,请参考以下文章