Wlan学习备忘(下)

HSM(对应的类是StateMachine)和AsyncChannel是Android Java Framework中两个重要
的类。不过,它们目前还仅由Framework内部使用,SDK中并没有包含它们。这两个类的作
用如下。
·HSM在传统状态机对所有状态都一视同仁的基础上做了一些改变,使得状态和状态之
间有了层级关系。HSM中的状态层级关系与Java中父子类的派生和继承关系类似,即在父状
态中实现generic的功能,而在子状态中实现一些特定的处理。不过,和Java中类派生不同的
是,HSM中父子状态对应的是毫无派生关系的两个类,所以使用时需要创建两个对象。而
Java中子类则从其父类派生,实际使用时创建一个子类对象即可,该子类对象就能完成父类
的工作。
·AsyncChannel用于两个Handler之间的通信。具体的通信方式为源Handler通过
sendMessage向目标Handler发送消息,而目标Handler通过replyToMessage回复源Handler处理

结果。注意,这两个Handler可位于同一个进程,也可分属两个不同的进程。

StateMachine
HSM在framework中的实现都是继承StateMachine,有WiFiStateMachine,WifiWatchdogMachine等。
下面先说StateMachine的实现规则和原理:
addState:添加一个状态。同时还可指定父状态。
·transitionTo:将状态机切换到某个状态。
·obtainMessage:由于HSM内部是围绕一个Handler来工作的,所以外界只能调用HSM的
obtainMessage以获取一个Message ① 。
·sendMessage:发送消息给HSM。HSM中的Handler会处理它。
·deferMessage:保留某个消息。该消息将留待下一个新状态中去处理。其内部实现就是
把这些被deferred的message保存到一个队列中。当HSM切换到新状态后,这些deferred消息将
被移到HSM内部Handler所对应消息队列的头部,从而新状态能首先处理这些deferred消息。
·start:启动状态机。
·停止状态机可使用quit或quitNow函数。这两个函数均会发送SM_QUIT_CMD消息给HSM
内部的Handler,不过效果略有区别。当使用quit时,SM_QUIT_CMD添加在消息队列尾;而
使用quitNow时,SM_QUIT_CMD被添加到消息队列头。
假设某个statemachine有如下关系的state:

·SM启动后,初始状态的EA将按派生顺序执行。即其祖先状态的enter()先执行,子状态的
enter()后执行。以示例代码中的初始状态mS5为例。当HSM的start调用完毕后,enter就()调用顺序为
mP0、mP1、mS1、mS5。

·当State发生切换时,旧State的exit先执行,新State的enter后执行,并且新旧State派生树
上对应的State也需要执行exit或enter函数。以mS5切换到mS4为例,在此切换过程中,首先执
行的是exit,其顺序是mS5,mS1。注意,exit执行的终点是离mS4和mS5最近的一个公共
(即同时是mS4和mS5的祖先)祖先State(此处是mP1),但公共祖先状态的exit不会执
行。然后执行的是enter,其顺序是mS2、mS4。同理,公共祖先的EA也不会执行。细心的读者
可以发现,HSM中enter和exit执行顺序和C++类构造/析构函数执行顺序类似。enter执行顺序由
祖先类开始直至子孙类,而析构函数的执行先从子孙类开始,直到祖先类。

·State处理Message时,如果子状态不能处理(返回NOT_HANDLED),则交给父状态去
处理。这一点也和C++中类的派生函数类似。


AsyncChannel
AsyncChannel用于两个Handler之间的通信,其用法包含两种不同的应用模式(usage
model)。
·简单的request/response模式下,Server端无须维护Client的信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值