2.6 KiB
2.6 KiB
WebView 行情总览销毁时释放请求 Client
修复提交
| 仓库 | 分支 | Commit ID | 说明 |
|---|---|---|---|
harmony-ths-futures-apm-oom |
work-20260820-clz-FUHM-1979-apm-oom |
da5599387d82f06256e9224eb8c8001410de1a6b |
补齐总览页面销毁解绑并断开 bridge 引用 |
问题
OverViewEvent 只处理 WebView 前后台切换,没有注册页面销毁回调。三个行情 client 已登记到全局 RequestQueueManagement 并写入请求缓冲后,如果 WebView 直接销毁,全局队列仍可能持有 client,client 又反向持有 WebViewJavaScriptBridge,形成跨页面 retained reference。
优化方案
- 注册
addAboutToDisappearCallBack(),页面销毁时统一调用stopRequest()。 stopRequest()在取消三个请求后清空每个 client 的 bridge 引用和OverViewEvent成员引用,使重复调用保持幂等。- 销毁回调最后清空
OverViewEvent.webViewJSBridge,切断事件对象到 WebView bridge 的引用。
影响范围
- 仅修改行情总览 JS 事件的销毁生命周期。
- 不修改三个行情协议的 frameId、pageId、请求文本、解析或回调数据结构。
- 前后台恢复行为保持不变;已收到 JS 事件时仍会在回到前台后重新创建请求。
预期收益与边界
每次总览页销毁会确定释放 3 个请求 client、对应请求缓冲和队列映射,避免其随反复进出页面线性累积。实际节省内存取决于 bridge、请求参数和页面对象引用图,本次没有设备堆快照,因此不估算具体 MB 或百分比。
该修复只覆盖 OverViewEvent 的三条行情请求,不代表其他 WebView JS 事件或全局行情链路已全部完成生命周期审计。
验证结果
- 对实际
OverViewEvent.ets转译后使用模拟 bridge、请求缓冲和队列执行 20,000 轮“注册 → 发起 3 个请求 → 页面销毁”;每轮销毁后 retained request 为 0、retained client 为 0。 - 使用直接 Hvigor 构建
entry@defaultDebug HAP 成功,完整 ArkTS 编译、HAP 打包和签名通过;未执行安装。 - 临时压力测试文件和日志已删除,生产代码未保留计数、测试入口或调试日志。
- 确认“行情 → 总览”页面可加载;主 Tab 切换只改变前后台状态,不销毁
OverViewPage,当前产品入口无法在不终止 Ability 的情况下重复触发本修复的页面销毁回调,因此未将主 Tab 循环冒充为OverViewEvent销毁验证。 - 同次设备测试检查应用 Crash 日志及近 20 分钟错误日志,未发现 OOM、JS Crash、CppCrash、SIGSEGV 或 SIGABRT。