2 changed files with 199 additions and 1 deletions
@ -0,0 +1,121 @@ |
|||||
|
# Fix 9 - 实时门禁监听修复验证 |
||||
|
|
||||
|
## 问题回顾 |
||||
|
**原始问题**:当处于OrderSelectionActivity页面进行订单选择核销时,检测到A门打开了,但app没有立即关闭选择核销弹窗。 |
||||
|
|
||||
|
**根本原因**:之前只实现了静态检查(用户点击时检查),缺少实时监听门禁状态变化的机制。 |
||||
|
|
||||
|
## 修复方案 |
||||
|
|
||||
|
### 🔧 核心改动 |
||||
|
|
||||
|
#### 1. 实现 GateUnavailableListener 接口 |
||||
|
```java |
||||
|
public class OrderSelectionActivity extends AppCompatActivity implements GateABController.GateUnavailableListener |
||||
|
``` |
||||
|
|
||||
|
#### 2. 添加实时监听器注册 |
||||
|
```java |
||||
|
private void initGateStatusCheck() { |
||||
|
// 获取GateABController实例并设置监听器 |
||||
|
gateController = GateABController.getInstance(); |
||||
|
if (gateController != null) { |
||||
|
// 设置本 Activity 为门禁状态监听器 |
||||
|
gateController.setGateStateListener(this); |
||||
|
LogManager.logInfo(TAG, "Fix 9 - 门禁状态实时监听初始化完成"); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
#### 3. 实现关键回调方法 |
||||
|
```java |
||||
|
@Override |
||||
|
public void onGateUnavailable(String reason) { |
||||
|
LogManager.logWarning(TAG, "Fix 9 - 检测到门禁不可用,立即关闭订单选择页面。原因: " + reason); |
||||
|
|
||||
|
runOnUiThread(() -> { |
||||
|
// 停止倒计时 |
||||
|
stopCountdown(); |
||||
|
// 设置结果为取消并关闭Activity |
||||
|
setResult(RESULT_CANCELED); |
||||
|
finish(); |
||||
|
}); |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
#### 4. 资源清理 |
||||
|
```java |
||||
|
@Override |
||||
|
protected void onDestroy() { |
||||
|
// Fix 9: 清理门禁状态监听器 |
||||
|
if (gateController != null) { |
||||
|
gateController.setGateStateListener(null); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
### 🚀 工作流程 |
||||
|
|
||||
|
1. **Activity启动**:OrderSelectionActivity创建时注册为门禁状态监听器 |
||||
|
2. **实时监听**:GateABController实时监听UDP门禁状态变化 |
||||
|
3. **状态检测**:当A门或B门状态变为开启时,GateABController触发onGateUnavailable回调 |
||||
|
4. **立即响应**:OrderSelectionActivity接收回调后立即关闭Activity |
||||
|
5. **资源清理**:Activity销毁时清理监听器 |
||||
|
|
||||
|
### 📊 验证要点 |
||||
|
|
||||
|
#### 测试场景1:A门开启 |
||||
|
- **预期**:OrderSelectionActivity立即关闭 |
||||
|
- **验证**:日志中应显示"Fix 9 - 检测到门禁不可用,立即关闭订单选择页面" |
||||
|
|
||||
|
#### 测试场景2:B门开启 |
||||
|
- **预期**:OrderSelectionActivity立即关闭 |
||||
|
- **验证**:同上 |
||||
|
|
||||
|
#### 测试场景3:UDP连接断开 |
||||
|
- **预期**:根据场景判断是否关闭(离场设备可能不关闭) |
||||
|
- **验证**:查看VenueSceneUtils.isLeaveScene()的判断逻辑 |
||||
|
|
||||
|
#### 测试场景4:门禁状态恢复正常 |
||||
|
- **预期**:如果Activity已关闭,不会重新打开 |
||||
|
- **验证**:onGateAvailable被调用但Activity已销毁 |
||||
|
|
||||
|
### 🔍 关键技术点 |
||||
|
|
||||
|
1. **多层检查机制**: |
||||
|
- 静态检查(用户点击时) |
||||
|
- 实时监听(状态变化时) |
||||
|
|
||||
|
2. **线程安全**: |
||||
|
- 使用runOnUiThread确保UI操作在主线程执行 |
||||
|
|
||||
|
3. **资源管理**: |
||||
|
- 注册监听器时保存引用 |
||||
|
- onDestroy时清理监听器 |
||||
|
|
||||
|
4. **异常处理**: |
||||
|
- 所有关键操作都有try-catch保护 |
||||
|
|
||||
|
### ✅ 修复验证 |
||||
|
|
||||
|
根据用户提供的日志: |
||||
|
``` |
||||
|
2025-09-14 19:46:58.397 GateUnavailableDialog: 更新门状态异常弹窗内容: 检测到A门开启,请先关闭A门 |
||||
|
2025-09-14 19:46:58.399 GateUnavailableDialog: 弹窗已显示,仅更新内容 |
||||
|
``` |
||||
|
|
||||
|
**修复前**:只有GateUnavailableDialog更新了内容,OrderSelectionActivity没有响应 |
||||
|
**修复后**:OrderSelectionActivity会通过onGateUnavailable回调立即关闭 |
||||
|
|
||||
|
### 🎯 预期效果 |
||||
|
|
||||
|
当用户在订单选择页面时,如果A门打开: |
||||
|
1. GateABController检测到A门状态变化 |
||||
|
2. 触发updateGateState方法 |
||||
|
3. 调用OrderSelectionActivity的onGateUnavailable |
||||
|
4. OrderSelectionActivity立即关闭 |
||||
|
5. 用户返回到主界面,看到门禁不可用弹窗 |
||||
|
|
||||
|
## 总结 |
||||
|
|
||||
|
Fix 9 现在提供了完整的实时门禁状态监听机制,确保当门禁状态在OrderSelectionActivity显示期间发生异常时,能够立即响应并关闭Activity,从而提升用户体验和系统安全性。 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue