# 交易页前台在线状态查询改为读缓存 ## 修复提交 | 仓库 | 分支 | Commit ID | 说明 | | --- | --- | --- | --- | | `harmony-ths-futures` | `work-20260818-clz-FUHM-1979-apm-appfreeze` | `8c3170778f50bf767c9146ea177e82080d629da2` | 交易页前台在线状态改为读缓存 `currentAccount.isOnline` | ## 问题 冻屏日志聚类 20020090(3 次):应用切回前台触发 `TradePage.isAbilityForeGroundChanged()` 时,主线程同步调用 `ApiCommon.isOnlineAccount()`,经 JSI 桥穿透到 `libweituo_sdk_ohos.so` 的 `SpiApiManager::getLoginSuccSpiApi` 并等待 `recursive_mutex`。当 SDK 网络线程(asio 断线/连接回调链路)持有该锁时,主线程卡在 `__timedwait_cp` 等锁 3.1/6.2 秒,3S/6S 抓栈逐帧一致,触发冻屏上报。 交易 SDK 1.0.13 的 `TradeAccount` 已维护应用侧在线状态:登录成功(`setLoginSuccess`)、断网(`checkAccountOnline`)、重登成功/失败(`TradeApiManager`)及退出登录(`resetUnLogined`)时经 `updateOnlineStatus()` 更新 `isOnline` 字段并广播 `ACCOUNT_ONLINE_STATUS_CHANGED` 事件。交易页已监听该事件,前台切换所需的"是否在线"用缓存即可回答,无需同步穿透 Native 查询。 ## 优化方案 1. `TradePage.isAbilityForeGroundChanged()` 中的 `ApiCommon.isOnlineAccount(currentAccount)` 替换为读缓存 `currentAccount.isOnline`。 2. 删除 `TradePage` 中不再使用的 `ApiCommon` import(全文件仅此一处使用)。 ## 影响范围 - 交易页前台切换时在线状态判断的数据来源,由 Native 同步查询改为应用侧缓存。 - 条件单查询时机不变:在线时立即 `checkConditionTriggeredForCurrentAccount()`,离线时置 `needQueryConditionTriggeredAfterTradeLogin`,登录成功后由 `onTradePushLoginResult`、切换账户后由 `onTradeLogin` 补查。 - 不修改交易 SDK、Native SO、`isOnline` 状态的维护链路及其事件广播。 ## 预期收益与边界 消除该主线程等锁入口,前台切换不再同步进入交易 SDK 锁域。`isOnline` 为应用侧维护状态,SDK 断线回调尚未到达的极短窗口内可能读到旧值,最多导致多查一次条件单(请求失败无害);彻底消除等锁风险仍需要 SDK 缩小 Native 锁范围并发布新的 SO。 ## 验证建议 1. 执行 `./claude_tool/claude_compile.sh` 编译通过。 2. 真机登录后反复前后台切换,确认条件单查询行为与改动前一致,hilog 中不再出现主线程 `isLoggedInAccount` 同步调用。 3. 断网后回前台、恢复网络、重登成功,确认 `onTradePushLoginResult` 兜底补查条件单的路径正常。 4. 检查冻屏主线程栈中是否仍出现 `mutex::lock → SpiApiManager::getLoginSuccSpiApi`。