5, 状态机
最早接触状态机是在数字电路中,比如十字路口的红绿黄灯,行人可以根据不同的状态而做出不同的行为.我觉得在状态机中至少有3个主要内容:
1,状态的管理
2,状态的切换
3,行为的执行
5.1初始化
初始化主要分为三个步骤:
5.1.1,子线程的初始化
在StateMachine的构造函数中,首先构造一个子线程,Looper,然后不断进行消息循环,最后利用该Looper初始化状态机,实例化SmHandler,
1. protected StateMachine(String name) {
2. mSmThread = new HandlerThread(name);
3. mSmThread.start();
4. Looper looper = mSmThread.getLooper();
5.
6. initStateMachine(name,looper);
7. }
HandlerThread类相关方法如下:
8. public HandlerThread(String name) {
9. super(name);
10. mPriority =Process.THREAD_PRIORITY_DEFAULT; // 设置线程优先级
11. }
12. @Override
13. public void run() {
14. mTid = Process.myTid();
15. Looper.prepare(); // 构造该线程的looper
16. synchronized (this) {
17. mLooper = Looper.myLooper();// 获取该线程的looper
18. notifyAll();
19. }
20. Process.setThreadPriority(mPriority);
21. onLooperPrepared();
22. Looper.loop(); // 开始消息循环
23. mTid = -1;
24. }
25. private void initStateMachine(String name,Looper looper) {
26. mName = name;
27. mSmHandler = new SmHandler(looper,this);
28. }
29. private SmHandler(Looper looper, StateMachinesm) {
30. super(looper);
31. mSm = sm;
32.
33. addState(mHaltingState, null);
34. addState(mQuittingState, null);
35. }
36.
HaltingState与QuittingState都是State的派生类,用于在状态停止和放弃之后处理的一些事情;都重写了ProcessMessage方法,
在StateMachine没有实际行动仅仅保留用于扩展。
SmHandler才是整个状态机的核心, StateMachine(主线程)中的相关函数/消息 都在SmHandler(字线程)进行处理,最后通过消息的形式发送出去,主线程进行处理。
5.1.2, 树形层次结构状态机的初始化
1. private HeadsetClientStateMachine(HeadsetClientServicecontext) {
2. super(TAG);
3. mService = context;
4.
5. mAdapter =BluetoothAdapter.getDefaultAdapter();
6. ···