From b51b9be167960b32c3a9af70422e4c9487b46c23 Mon Sep 17 00:00:00 2001 From: lanterngamescn Date: Sat, 27 Jun 2026 14:10:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(share):=20=E9=87=8A=E6=94=BEPixelMap/ImageS?= =?UTF-8?q?ource=20+=20=E6=8C=87=E5=BC=95=E7=9B=91=E5=90=AC=20onDestroy=20?= =?UTF-8?q?=E9=80=80=E8=AE=A2=EF=BC=88code=20review=20C1/C2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - C1: writeClipboardImage 在 finally 显式 pm.release()/source.release(),消除原生堆对象泄漏 - C2: 新增 guideCancelFn 字段;guide() 先退订悬挂监听再登记新监听、触发后清空;onDestroy() 退订;防用户不操作指引窗时 EventBus.once 永久悬挂 - I3: open 分支补注释说明乐观回传有意不等 openLink 完成 Co-Authored-By: Claude Sonnet 4.6 --- .../src/main/ets/providers/ShareProvider.ets | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/feature_capabilities/src/main/ets/providers/ShareProvider.ets b/feature_capabilities/src/main/ets/providers/ShareProvider.ets index f24d2f7..de0e4c9 100644 --- a/feature_capabilities/src/main/ets/providers/ShareProvider.ets +++ b/feature_capabilities/src/main/ets/providers/ShareProvider.ets @@ -41,6 +41,8 @@ export class ShareProvider implements CapabilityProvider { /** 落盘 + resultEvent 命名计数器(实例自增,避免 Math.random 串扰)。 */ private seq: number = 0; private photoUploadCancel: (() => void) | undefined = undefined; + /** 当前指引窗一次性监听的退订函数(用户不操作时由 onDestroy/下一次 guide 退订,防悬挂泄漏)。 */ + private guideCancelFn: (() => void) | undefined = undefined; constructor() { ShareProvider.instanceCount += 1; @@ -62,6 +64,10 @@ export class ShareProvider implements CapabilityProvider { this.photoUploadCancel(); this.photoUploadCancel = undefined; } + if (this.guideCancelFn !== undefined) { + this.guideCancelFn(); + this.guideCancelFn = undefined; + } } // —— 入站 —— @@ -195,9 +201,17 @@ export class ShareProvider implements CapabilityProvider { } private guide(bean: SharetypeBean, platform: string, kind: string, filePath: string): void { + // 退订上一个可能悬挂的指引监听(用户上次未操作就再次触发分享)。 + if (this.guideCancelFn !== undefined) { + this.guideCancelFn(); + this.guideCancelFn = undefined; + } this.seq += 1; const resultEvent: string = `share.guide.${this.instanceId}.${this.seq}`; - EventBus.once(resultEvent, (p) => this.onGuideAction(bean, platform, kind, filePath, p)); + this.guideCancelFn = EventBus.once(resultEvent, (p) => { + this.guideCancelFn = undefined; + this.onGuideAction(bean, platform, kind, filePath, p); + }); const req: ShareGuideRequest = { platform, contentKind: kind, resultEvent }; EventBus.emit(ShareEvents.SHOW_GUIDE, req); } @@ -212,6 +226,7 @@ export class ShareProvider implements CapabilityProvider { const reportType: number = bean.sharefriend === '1' ? 1 : 2; if (action === 'open') { this.openApp(uiCtx, platform); + // 乐观回传:不等 openLink 完成即视为已发起(契约 sharesuccess 仅微信完整)。 if (platform === 'wechat') { this.reportResult(2, reportType); } @@ -285,9 +300,13 @@ export class ShareProvider implements CapabilityProvider { .catch((e: BusinessError) => this.log.w(`clipboard image failed: ${e.code} ${e.message}`)); } catch (e) { this.log.w(`clipboard image init failed: ${(e as Error).message}`); + } finally { + pm.release(); } }).catch((e: BusinessError) => { this.log.w(`createPixelMap failed: ${e.code} ${e.message}`); + }).finally(() => { + source.release(); }); }