HierarchicalStateMachine(HandlerStateMachine)分析

来源:互联网 发布:数据监控系统 编辑:程序博客网 时间:2024/05/24 07:19
1.Hierarchical State Machine pattern原理。
http://www.360doc.com/content/10/1105/15/4238731_66855208.shtml
 
2.android.os.HandlerStateMachine(android 2.0中提供)
com.android.internal.util.HierarchicalStateMachine(android 2.2.1 froyo中提供)
的简化版。
HierarchicalStateMachine源代码参照:
http://blog.chinaunix.net/space.php?uid=17151843&do=blog&id=142162
 

3. HierarchicalStateMachine是一个机器,这个机器是含有状态的机器,
机器的每个状态都可以有父状态,如果当前状态需要父状态作处理, 那么让该状态的processMessage返回false

4. 当前状态和它的父状态们放在mStateStack数组中,active是用来记录StateInfo包含的state是否是active,在后面计算当前状态和目标状态的共同父状态过程中使用。
所有状态和状态的StateInfo的键值对存放在HashMap mStateInfo中。
/** The map of all of the states in the state machine */
        private HashMap<HierarchicalState, StateInfo> mStateInfo =
            new HashMap<HierarchicalState, StateInfo>();
/** Stack used to manage the current hierarchy of states */
        private StateInfo mStateStack[];

5. 转换状态:performTransitions()
a. 寻找当前状态和目标状态的共同父状态,从目标状态开始循环查询父状态的active是否是true,如果是active,说明是当前状态和目标状态的父状态,并依次放入数组mTempStateStack中。
b. 从当前状态到共同父状态(不包括本身)依次调用exit,并将active设置为false,将mStateStackTopIndex设置成mStateStack数组的个数。
c. 反序将mTempStateStack中的元素拷贝到mStateStack中,并重新设置mStateStackTopIndex,并返回第一个需要调用enter的state的index startingIndex
d. 从共同父状态到目标状态依次调用enter
e. 移动ArrayLiist mDeferredMessages中的deffered message, 从尾部开始将message加入到MessageQueue中的第一个,这样,最先加入mDeferredMessages中的Message第一个得到执行。并且deffered message比普通Message先执行。

原创粉丝点击