解决WebView内存泄漏
# 解决 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()
}
上次更新: 2024/09/21, 10:11:36
- 01
- Flutter - 轻松搞定炫酷视差(Parallax)效果09-21
- 02
- Flutter - 轻松实现PageView卡片偏移效果09-08
- 03
- Flutter - 升级到3.24后页面还会多次rebuild吗?🧐08-11