Files

2.7 KiB

交易页前台在线状态查询改为读缓存

修复提交

仓库 分支 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.soSpiApiManager::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