You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI Android应用中含WebView页面的正确销毁与资源释放方法咨询

MAUI Android 正确释放WebView页面资源避免内存泄漏

在MAUI Android中,直接通过PopAsync关闭带WebView的页面后,原生WebView实例并不会自动销毁,这是因为MAUI的抽象层没有直接调用Android原生WebView的Destroy方法。以下是解决这个问题的具体方案:

核心解决方案:调用原生WebView的Destroy方法

在包含WebView的页面(NewPage1)中,重写OnDisappearing方法,获取Android原生WebView实例并调用销毁方法,同时断开MAUI与原生控件的关联:

protected override void OnDisappearing()
{
    base.OnDisappearing();
    
    if (webview == null) return;

    // 获取Android平台的原生WebView实例
    var nativeWebView = webview.Handler.PlatformView as Android.Webkit.WebView;
    nativeWebView?.Destroy();

    // 断开MAUI Handler与原生控件的连接,避免引用残留
    webview.Handler?.DisconnectHandler();
    
    // 释放C#层的引用
    webview = null;
}

关键步骤说明:

  • Destroy():Android原生WebView的该方法会彻底销毁WebView占用的所有资源(包括渲染引擎、缓存、JS上下文等),是清理WebView的核心操作。
  • DisconnectHandler():断开MAUI的Handler与原生控件的关联,防止MAUI层的引用导致原生对象无法被GC回收。
  • 置空WebView引用:移除C#层对WebView对象的强引用,帮助CLR垃圾回收器回收资源。

额外优化建议

  • 避免页面实例被外部持有:确保主页或其他长生命周期对象中没有持有NewPage1的实例引用,否则即使调用了销毁方法,页面也可能无法被回收。
  • 清理WebView的加载状态:在销毁前可以先调用nativeWebView?.StopLoading(),终止正在进行的网络请求,加快资源释放。

验证效果

按照之前的复现步骤操作后,再次打开edge://inspect/#devices查看,残留的WebView实例应该会被清除,不会再出现每次跳转都新增实例的情况。

为什么之前的方法无效?

  • 仅将webview设为null:只是断开了C#层的引用,但Android原生WebView实例仍被系统持有,无法被回收。
  • 使用WebView单例:单例模式会让WebView实例长期存在,不符合页面跳转的场景,反而会积累缓存和资源,无法解决单次页面关闭后的资源释放问题。

内容的提问来源于stack exchange,提问作者ac-lap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:12:54