Skip to content

WebView

WebView是一种用于展示web页面的原生控件 作用:

  1. 显示和渲染web界面
  2. 可以直接使用html文件(网络上或本地assets中)作布局
  3. 可和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

解决方案

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

初始化webview

初始化webView不要在xml通过控件的方式引入,而是需要通过代码添加 WebView 内存泄露的主要原因是引用了 Activity/Fragment 的 Context,加之 WebView 本身的设计问题,导致 Activity/Fragment 无法被即时释放,既然 WebView 无法即时释放 Context,那就让它引用全局的 Context 就好了:

python
val webview = WebView(this.applicationContext)

销毁webView

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

  1. 将 WebView 从其父控件中移除
  2. 让 WebView 停止加载页面并释放
kotlin
override fun onDestroy() {
    val parent = webView?.parent
    if (parent is ViewGroup) {
        parent.removeView(webView)
    }
    webView?.destroy()
    super.onDestroy()
}

怎么使用拦截器

常见问题

https://juejin.cn/post/6844904149608300552#heading-7