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