博客概述
在一些模块的开发中,经常用到一些状态量,对这些状态量的使用可以用很好的设计模块的状态来执行或者拒绝一些操作。在我的一个项目的登录模块中用到了蓝牙和发卡器登录。发卡器模块就是用到了一个简单的是否接受串口数据的状态量,如果接受就走解析模块,如果不接收就拒绝这次的数据。蓝牙模块就相对复杂一些,需要4个状态量来标示蓝牙模块的状态。
状态量设计
private enum Status{
NORMAL(1), //正常
SCANNING(2), //扫描
CONNECTING(3), //连接中,
TRY_CONNECTING(4);// 尝试连接
private int value = 0;
private Status(int value) { //必须是private的,否则编译错误
this.value = value;
}
public static Status valueOf(int value) { //手写的从int到enum的转换函数
switch (value) {
case 1:
return NORMAL;
case 2:
return SCANNING;
case 3:
return CONNECTING;
case 4:
return TRY_CONNECTING;
default:
return null;
}
}
public int value() {
return this.value;
}
}
设计一个内部类来表示蓝牙模块的状态。
状态量的使用
可以使用状态量来接受或者拒绝操作,如:
案例一:
//如果不是尝试连接状态一律return,包括scanning,nomal,connecting,
if (status != Status.TRY_CONNECTING){
return;
}
//直接连接mac地址
connectMAC(mac);
案例二:
//如果蓝牙模块在扫描状态,则返回,否则设置为nomal
if(BleManager.getInstance().getScanSate()== BleScanState.STATE_SCANNING){
return;
}else{
//如果代码逻辑在扫描状态,但是蓝牙模块在空闲状态,则纠正蓝牙service为nomal状态。
if(status == Status.SCANNING){
status = Status.NORMAL;
}
}
//1。针对跳到待机页面,蓝牙还连接着的情况的处理办法。
//2。正常情况下,在已经连接了蓝牙的情形中,在发出扫描请求,拒绝是对的。
//3。有一种情况,登陆界面扫描到之后,尝试连接,然后又来了一次断开连接,
if (status == Status.CONNECTING){
return;
}
//尝试连接状态,当然也不执行了
if (status == Status.TRY_CONNECTING){
return;
}