oxFaceAndroid
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.0 KiB

Fix 9 - 实时门禁监听修复验证

问题回顾

原始问题:当处于OrderSelectionActivity页面进行订单选择核销时,检测到A门打开了,但app没有立即关闭选择核销弹窗。

根本原因:之前只实现了静态检查(用户点击时检查),缺少实时监听门禁状态变化的机制。

修复方案

🔧 核心改动

1. 实现 GateUnavailableListener 接口

public class OrderSelectionActivity extends AppCompatActivity implements GateABController.GateUnavailableListener

2. 添加实时监听器注册

private void initGateStatusCheck() {
    // 获取GateABController实例并设置监听器
    gateController = GateABController.getInstance();
    if (gateController != null) {
        // 设置本 Activity 为门禁状态监听器
        gateController.setGateStateListener(this);
        LogManager.logInfo(TAG, "Fix 9 - 门禁状态实时监听初始化完成");
    }
}

3. 实现关键回调方法

@Override
public void onGateUnavailable(String reason) {
    LogManager.logWarning(TAG, "Fix 9 - 检测到门禁不可用,立即关闭订单选择页面。原因: " + reason);
    
    runOnUiThread(() -> {
        // 停止倒计时
        stopCountdown();
        // 设置结果为取消并关闭Activity
        setResult(RESULT_CANCELED);
        finish();
    });
}

4. 资源清理

@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,从而提升用户体验和系统安全性。