13.WebView
WebView是一种用于展示web页面的原生控件 作用:
- 显示和渲染web界面
- 可以直接使用html文件(网络上或本地assets中)作布局
- 可和JavaScript交互调用
基本使用
https://blog.csdn.net/devilnov/article/details/117323956
内存泄漏
WebView 中的内存泄漏其实与 Chromium 内核版本有关,在新版本的 Chromium 内核中内存泄漏问题已经被解决了,而且从 Android 5.0(Lollipop) 版本开始将 Chromium WebView 迁移到了一个独立的 APP -- Android System WebView,随着 Android System WebView 的独立发布,低版本 Android 系统(Android 5以上)上搭载的 Chromium 内核一般来说也不会太旧,所以出现内存泄漏的概率应该是比较小的。如果仍需要兼容这很小的一部分机型,可以通过文章开头的方式销毁 WebView,即先移除 WebView 组件,确保先调用到 onDetachedFromWindow 方法解注册,然后再通过 WebView.destroy 方法处理其它销毁逻辑。 链接:https://juejin.cn/post/6901487965562732551
解决方案
- 不要使用** xml 方式创建**,而是使用代码把 WebView 给 new 出来
- 不要让 WebView 持有对 Activity/Fragment 的 Context 引用(核心)
- 销毁时,停止 WebView 的加载,并从父控件中将其移除
初始化webview
初始化webView不要在xml通过控件的方式引入,而是需要通过代码添加 WebView 内存泄露的主要原因是引用了 Activity/Fragment 的 Context,加之 WebView 本身的设计问题,导致 Activity/Fragment 无法被即时释放,既然 WebView 无法即时释放 Context,那就让它引用全局的 Context 就好了:
val webview = WebView(this.applicationContext)
销毁webView
为了保证 Activity/Fragment 界面销毁时,WebView 不要在后台继续进行没有意义的加载,并且避免父控件对 WebView 的引用导致发生意外泄露,需要进行如下 2 步:
- 将 WebView 从其父控件中移除
- 让 WebView 停止加载页面并释放
override fun onDestroy() {
val parent = webView?.parent
if (parent is ViewGroup) {
parent.removeView(webView)
}
webView?.destroy()
super.onDestroy()
}