阅读 787

解决WebView内存泄漏【最干货】

欢迎关注微信公众号:FSA全栈行动 👋

解决 WebView 内存泄漏

要解决 WebView 内存泄漏的要点如下:

  • 不要使用 xml 方式创建,而是使用代码把 WebView 给 new 出来
  • 不要让 WebView 持有对 Activity/Fragment 的 Context 引用(核心)
  • 销毁时,停止 WebView 的加载,并从父控件中将其移除

1、初始化 WebView

WebView 内存泄露的主要原因是引用了 Activity/Fragment 的 Context,加之 WebView 本身的设计问题,导致 Activity/Fragment 无法被即时释放,既然 WebView 无法即时释放 Context,那就让它引用全局的 Context 就好了:

// 让 WebView 使用 ApplicationContext
val webview = WebView(this.applicationContext)
复制代码

切记:不要在 xml 中使用 <WebView> 标签创建 WebView

2、销毁 WebView

为了保证 Activity/Fragment 界面销毁时,WebView 不要在后台继续进行没有意义的加载,并且避免父控件对 WebView 的引用导致发生意外泄露,需要进行如下 2 步:

  • 将 WebView 从其父控件中移除
  • 让 WebView 停止加载页面并释放
override fun onDestroy() {
    // webview?.loadDataWithBaseURL(null, "", "text/html", "utf-8", null)
    // webview?.clearView()
    webview?.loadUrl("about:blank")
    webview?.parent?.let {
        (it as ViewGroup).removeView(webview)
    }
    webview?.stopLoading()
    webview?.settings?.javaScriptEnabled = false
    webview?.clearHistory()
    webview?.clearCache(true)
    webview?.removeAllViewsInLayout()
    webview?.removeAllViews()
    webview?.webViewClient = null
    webview?.webChromeClient = null
    webview?.destroy()
    webview = null
    super.onDestroy()
}
复制代码
文章分类
Android
文章标签