android 状态机的作用,Android 状态机、状态模式 基础框架实现
一、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 状态机、状态模式 基础框架实现相关推荐
- java状态机设计模式_Java设计模式之状态模式详解
(本文由言念小文原创,转载请注明出处) 在实际工作中经常遇到某个对象,处于不同的状态有不同行为逻辑.且状态之间可以相互迁移的业务场景,特别是在开发通信协议栈类软件中尤为多见.<设计模式之禅> ...
- android布局的作用,Android UI布局经验总结
如何在Android中动态设置颜色透明?10%20%到100% Android布局分析工具HierarchyView Android使用include/merge/ViewStub优化布局 List的 ...
- android 混淆规则作用,Android混淆规则
简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...
- android minheight的作用,Android 自定义 View 最少必要知识
1. 什么是自定义 View? 1.1 定义 在 Android 系统中,界面中所有能看到的元素都是 View.默认情况下,Android 系统为开发者提供了很多 View,比如用于展示文本信息的 T ...
- Android适配器以及作用,Android RecyclerView 通用适配器的实现
分析 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并 ...
- android scaletype没作用,Android ImageView 的scaleType 属性图解
ImageView 是 Android 中最常用的控件之一,而在使用ImageView时,必不可少的会使用到它的scaleType属性.该属性指定了你想让ImageView如何显示图片,包括是否进行缩 ...
- Android监听作用,Android开发之CheckBox的简单使用与监听功能示例
本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...
- android scaletype没作用,Android ImageView的ScaleType属性
参考 ScaleType属性 常量 含义 fitXY 横向.纵向独立缩放,以适应该ImageView fitCenter 保持纵横比缩放图片,缩放完成后将图片放在ImageView的中央 fitSta ...
- android scaletype没作用,Android源码系列之深入理解ImageView的ScaleType属性
做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项 ...
最新文章
- 参考WebStorm设置VSCode“转到编辑器中的符号”快捷键为Shift双击(这是一个频繁使用的快捷键)
- 21 款 yyds 的 IDEA插件
- 图解自监督学习,人工智能蛋糕中最大的一块
- java 异步请求重定向_JavaEE通过response实现请求重定向
- STM32外设驱动---SysTick精准延时
- magento php mysql,安装lnmp nginx php mysql环境 -magento
- Expression Blend 定义RadioButton行为动画
- Nginx负载均衡状态之backup
- python类和oop基础知识
- IE6的重定向页面无法跳转解决
- Spring boot中使用aop详解
- Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)
- 西南财大计算机学院官网,西南财经大学
- Android ImageView ScaleType:图解
- python pandas库的应用(类比mysql语言)
- keras搭建多层LSTM
- 免费课程:Java高级教程-项目部分视频——私塾在线提供
- java.sql.date获取当前时间_关于JDBC中如何使用sql.Date获取当前时间以及对时间的操作和转换...
- FileZilla客户端远程连接FTP中文出现乱码
- python- 小猫钓鱼纸牌游戏