4.3 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.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 查询。
线上真实数据补充
2026-08-21 补充的 TOP10 耗时函数线上统计中,交易页前台链路仍被采样命中:
| TOP | 函数 | 故障出现次数 | 调用次数 | 总耗时 |
|---|---|---|---|---|
| 10 | onForeground entry|biz_trade|1.0.0|src/main/ets/views/tab/TradeGuaDanListView.ts |
1 | 10 | 3000ms |
该样本不是 TradePage.isAbilityForeGroundChanged() 的同一函数,但同属交易页前台恢复路径。当前 TradeGuaDanListView.onForeground() 会立即触发 GuaDanViewModel.sendRequest(),其中包含条件单标签查询和挂单查询;如果前后台切换、刷新和交易推送相互叠加,仍可能造成主线程连续调度和 SDK 请求入口放大。后续可对前台刷新增加去重、节流或复用正在进行的查询。
TOP20 线上数据补充
TOP20 未直接命中 TradeGuaDanListView.onForeground(),但命中了交易页自动重登录入口:
| TOP | 函数 | 故障出现次数 | 调用次数 | 总耗时 |
|---|---|---|---|---|
| 19 | tryToReLoginAccount entry|biz_trade|1.0.0|.../TradeApiManager.ts |
44 | 440 | 132000ms |
| 20 | anonymous entry|biz_trade|1.0.0|.../TradeApiManager.ts |
44 | 440 | 132000ms |
该结果说明前台恢复、推送和交易页刷新仍可能汇聚到自动重登录链路,但两个函数属于同一入口的分层采样,不能重复计为两项独立耗时。TradePage 的在线状态查询已改为读缓存;TradeApiManager 的同步复用 IP 查询仍需结合新版 SDK 线上采样继续确认。
优化方案
TradePage.isAbilityForeGroundChanged()中的ApiCommon.isOnlineAccount(currentAccount)替换为读缓存currentAccount.isOnline。- 删除
TradePage中不再使用的ApiCommonimport(全文件仅此一处使用)。
影响范围
- 交易页前台切换时在线状态判断的数据来源,由 Native 同步查询改为应用侧缓存。
- 条件单查询时机不变:在线时立即
checkConditionTriggeredForCurrentAccount(),离线时置needQueryConditionTriggeredAfterTradeLogin,登录成功后由onTradePushLoginResult、切换账户后由onTradeLogin补查。 - 不修改交易 SDK、Native SO、
isOnline状态的维护链路及其事件广播。
预期收益与边界
消除该主线程等锁入口,前台切换不再同步进入交易 SDK 锁域。isOnline 为应用侧维护状态,SDK 断线回调尚未到达的极短窗口内可能读到旧值,最多导致多查一次条件单(请求失败无害);彻底消除等锁风险仍需要 SDK 缩小 Native 锁范围并发布新的 SO。
验证建议
- 执行
./claude_tool/claude_compile.sh编译通过。 - 真机登录后反复前后台切换,确认条件单查询行为与改动前一致,hilog 中不再出现主线程
isLoggedInAccount同步调用。 - 断网后回前台、恢复网络、重登成功,确认
onTradePushLoginResult兜底补查条件单的路径正常。 - 检查冻屏主线程栈中是否仍出现
mutex::lock → SpiApiManager::getLoginSuccSpiApi。