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