一、StateMachine 要解决的问题

从设计模式的角度来讲,状态模式和策略模式类图是一样的,所以工作原理也类似。但相比较于策略模式,状态模式需要管理好状态树,以及维护状态对象的生命周期。

所以,将 Android 源代码中 WifiStateMachine 所依赖使用的状态机框架拿过来,用来生成状态树以及管理状态生命周期。

二、使用方式

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

...

implementation 'com.github.hailouwang:statemachine:1.0.0'

}

三、Demo 案例

1、单状态 案例

public static void main(String args[]){

testHelloWorld();

}

static class HelloWorld extends StateMachine {

HelloWorld(String name) {

super(name);

addState(mState1);

setInitialState(mState1);

}

public static HelloWorld makeHelloWorld() {

HelloWorld hw = new HelloWorld("hlwang");

hw.start();

return hw;

}

class State1 extends State {

@Override

public boolean processMessage(Message msg) {

log("Hello World");

return HANDLED;

}

}

State1 mState1 = new State1();

}

void testHelloWorld() {

HelloWorld hw = HelloWorld.makeHelloWorld();

hw.sendMessage(hw.obtainMessage());

}

2、多状态协同 案例

构建如下状态树:

mP1 mP2

/

mS2 mS1

public static void main(String args[]){

testMoreStateTransaction();

}

static class Hsm1 extends StateMachine {

public static final int CMD_1 = 1;

public static final int CMD_2 = 2;

public static final int CMD_3 = 3;

public static final int CMD_4 = 4;

public static final int CMD_5 = 5;

public static Hsm1 makeHsm1() {

Log.d("hlwang", "makeHsm1 E");

Hsm1 sm = new Hsm1("hlwang");

sm.start();

Log.d("hlwang", "makeHsm1 X");

return sm;

}

Hsm1(String name) {

super(name);

log("ctor E");

// Add states, use indentation to show hierarchy

addState(mP1);

addState(mS1, mP1);

addState(mS2, mP1);

addState(mP2);

// Set the initial state

setInitialState(mS1);

log("ctor X");

}

class P1 extends State {

@Override

public void enter() {

log("mP1.enter");

}

@Override

public boolean processMessage(Message message) {

boolean retVal;

log("mP1.processMessage what=" + message.what);

switch (message.what) {

case CMD_2:

// CMD_2 will arrive in mS2 before CMD_3

sendMessage(obtainMessage(CMD_3));

deferMessage(message);

transitionTo(mS2);

retVal = HANDLED;

break;

default:

// Any message we don't understand in this state invokes unhandledMessage

retVal = NOT_HANDLED;

break;

}

return retVal;

}

@Override

public void exit() {

log("mP1.exit");

}

}

class S1 extends State {

@Override

public void enter() {

log("mS1.enter");

}

@Override

public boolean processMessage(Message message) {

log("S1.processMessage what=" + message.what);

if (message.what == CMD_1) {

// Transition to ourself to show that enter/exit is called

transitionTo(mS1);

return HANDLED;

} else {

// Let parent process all other messages

return NOT_HANDLED;

}

}

@Override

public void exit() {

log("mS1.exit");

}

}

class S2 extends State {

@Override

public void enter() {

log("mS2.enter");

}

@Override

public boolean processMessage(Message message) {

boolean retVal;

log("mS2.processMessage what=" + message.what);

switch (message.what) {

case (CMD_2):

sendMessage(obtainMessage(CMD_4));

retVal = HANDLED;

break;

case (CMD_3):

deferMessage(message);

transitionTo(mP2);

retVal = HANDLED;

break;

default:

retVal = NOT_HANDLED;

break;

}

return retVal;

}

@Override

public void exit() {

log("mS2.exit");

}

}

class P2 extends State {

@Override

public void enter() {

log("mP2.enter");

sendMessage(obtainMessage(CMD_5));

}

@Override

public boolean processMessage(Message message) {

log("P2.processMessage what=" + message.what);

switch (message.what) {

case (CMD_3):

break;

case (CMD_4):

break;

case (CMD_5):

transitionToHaltingState();

break;

}

return HANDLED;

}

@Override

public void exit() {

log("mP2.exit");

}

}

@Override

public void onHalting() {

log("halting");

synchronized (this) {

this.notifyAll();

}

}

P1 mP1 = new P1();

S1 mS1 = new S1();

S2 mS2 = new S2();

P2 mP2 = new P2();

}

四、备注

1、处于状态子树的状态,如果未处理请求,会将请求交给父状态继续处理。如上案例所示,S1 未处理的请求,P1 会接手处理。

android 状态机的作用,Android 状态机、状态模式 基础框架实现相关推荐

  1. java状态机设计模式_Java设计模式之状态模式详解

    (本文由言念小文原创,转载请注明出处) 在实际工作中经常遇到某个对象,处于不同的状态有不同行为逻辑.且状态之间可以相互迁移的业务场景,特别是在开发通信协议栈类软件中尤为多见.<设计模式之禅> ...

  2. android布局的作用,Android UI布局经验总结

    如何在Android中动态设置颜色透明?10%20%到100% Android布局分析工具HierarchyView Android使用include/merge/ViewStub优化布局 List的 ...

  3. android 混淆规则作用,Android混淆规则

    简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...

  4. android minheight的作用,Android 自定义 View 最少必要知识

    1. 什么是自定义 View? 1.1 定义 在 Android 系统中,界面中所有能看到的元素都是 View.默认情况下,Android 系统为开发者提供了很多 View,比如用于展示文本信息的 T ...

  5. Android适配器以及作用,Android RecyclerView 通用适配器的实现

    分析 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并 ...

  6. android scaletype没作用,Android ImageView 的scaleType 属性图解

    ImageView 是 Android 中最常用的控件之一,而在使用ImageView时,必不可少的会使用到它的scaleType属性.该属性指定了你想让ImageView如何显示图片,包括是否进行缩 ...

  7. Android监听作用,Android开发之CheckBox的简单使用与监听功能示例

    本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...

  8. android scaletype没作用,Android ImageView的ScaleType属性

    参考 ScaleType属性 常量 含义 fitXY 横向.纵向独立缩放,以适应该ImageView fitCenter 保持纵横比缩放图片,缩放完成后将图片放在ImageView的中央 fitSta ...

  9. android scaletype没作用,Android源码系列之深入理解ImageView的ScaleType属性

    做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项 ...

最新文章

  1. 参考WebStorm设置VSCode“转到编辑器中的符号”快捷键为Shift双击(这是一个频繁使用的快捷键)
  2. 21 款 yyds 的 IDEA插件
  3. 图解自监督学习,人工智能蛋糕中最大的一块
  4. java 异步请求重定向_JavaEE通过response实现请求重定向
  5. STM32外设驱动---SysTick精准延时
  6. magento php mysql,安装lnmp nginx php mysql环境 -magento
  7. Expression Blend 定义RadioButton行为动画
  8. Nginx负载均衡状态之backup
  9. python类和oop基础知识
  10. IE6的重定向页面无法跳转解决
  11. Spring boot中使用aop详解
  12. Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)
  13. 西南财大计算机学院官网,西南财经大学
  14. Android ImageView ScaleType:图解
  15. python pandas库的应用(类比mysql语言)
  16. keras搭建多层LSTM
  17. 免费课程:Java高级教程-项目部分视频——私塾在线提供
  18. java.sql.date获取当前时间_关于JDBC中如何使用sql.Date获取当前时间以及对时间的操作和转换...
  19. FileZilla客户端远程连接FTP中文出现乱码
  20. python- 小猫钓鱼纸牌游戏

热门文章

  1. 自动打开WINDWOS远程控制的注册表文件
  2. 怎么样做一个漂亮女人
  3. C#关闭一个窗口的同时打开另一个窗口
  4. 【xml】python的lxml库使用
  5. Web ReplayType?
  6. linux 文件夹换所属用户,Linux中账号管理之权限管理(下)
  7. php 获取class id,CSS Class 與 CSS ID
  8. 广州自由自在进口食品休闲消费的趋势
  9. 【MM模块】Invoice Verification in the Background 后台发票校验
  10. 关于SAP Router连接不稳定的改良