WebView渲染异常导致闪退问题的解决方案

 更新时间:2025年02月27日 10:37:29   作者:封妖九禁苍天泣  
这篇文章主要介绍了WebView渲染异常导致闪退问题的解决方案,文中通过设置WebViewClient重写onRenderProcessGone()方法并移除、重新创建Web容器来解决该问题,需要的朋友可以参考下

背景:

App主页面使用了大量WebView容器(10个以上)显示图表信息,最新发现bugly上面出现一些关于浏览器Native Crash,如下:

经排查,是WebView渲染失败导致Crash,可以通过webView.loadUrl("chrome://crash")模拟。

解决方法:

1、通过设置WebViewClient,重写onRenderProcessGone()返回值,强制返回true,表示在WebView发生异常时,自己处理,这样App就不会出现Crash。这么做App虽然没有Crash,但是主页面的WebView内容却看不到了,看到的是白色/黑色背景,体验极差。

2、要想解决WebView内容不可见问题,还需要在Web出现异常的时候,移除原有Web容器,重新创建一个Web容器,代码如下:

class ReportWebView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : wendu.dsbridge.BaseWebView(context, attrs) {

    var reloadFun: ((any: ReportWebView) -> Unit)? = null
    private var parentViewGroup: ViewGroup? = null

    init {
        webViewClient = CustomWebViewClient()
    }

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        parentViewGroup = parent as? ViewGroup
    }

    private inner class CustomWebViewClient : WebViewClient() {

        override fun onRenderProcessGone(view: WebView?, detail: RenderProcessGoneDetail?): Boolean {
            // 所有的web都crash,所以都需要重建
            recreateWebViewAndReload(view)
            return true
        }
    }

    private fun recreateWebViewAndReload(view: WebView?) {
        val originalUrl = view?.url// 原始webView地址
        val isVisible = view?.isVisible
        val lp = this.layoutParams
        // 移除旧的 WebView
        val index = indexInParent()
        if (parentViewGroup != null) {
            parentViewGroup?.removeView(this)
        }
        destroy()// 销毁

        // 重新创建 WebView
        val newWebView = ReportWebView(context)
        reloadFun?.invoke(newWebView)
        newWebView.reloadFun = reloadFun
        newWebView.id = id
        newWebView.layoutParams = lp
        newWebView.isVisible = isVisible.nullOr(false)
        originalUrl?.let { newWebView.loadUrl(it) }

        // 将新的 WebView 添加回布局中
        parentViewGroup?.addView(newWebView, index)

        // 更新引用
        parentViewGroup = newWebView.parent as? ViewGroup
    }

    private fun indexInParent(): Int {
        return parentViewGroup?.indexOfChild(this) ?: -1
    }

}

本项目桥接使用的是DSBridge三方库,在创建Web容器需要设置addJavascriptObject(),即reloadFun函数。

注意事项:

1、同一个页面只要有一个渲染异常,会导致所有Web容器异常,所以所有Web容器都要重新创建,不可以根据Web可见状态只创建可见的Web。

2、在使用的时候,原有的Web容器已被移除,需要使用最新的Web容器,否则就会报错。上述代码中,新的Web容器id跟移除的一样,所以也很容易拿到新的Web容器,代码如下:

/**
 * 获取真实的webView,之前的web可能被销毁
 * @param id web id
 */
private fun getRealWebView(id: Int): ReportWebView {
    return mBinding.root.findViewById(id)
}

总结 

到此这篇关于WebView渲染异常导致闪退问题解决方案的文章就介绍到这了,更多相关WebView渲染异常闪退内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Android如何解决虚拟按键栏遮挡问题

    Android如何解决虚拟按键栏遮挡问题

    这篇文章主要介绍了Android如何解决虚拟按键栏遮挡问题,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-03-03
  • Android 5.0及以上编程实现屏幕截图功能的方法

    Android 5.0及以上编程实现屏幕截图功能的方法

    这篇文章主要介绍了Android 5.0及以上编程实现屏幕截图功能的方法,结合实例形式分析了Android5.0以上实现截图功能的相关类、函数及权限控制等操作技巧,需要的朋友可以参考下
    2018-01-01
  • 解决Android解析图片的OOM问题的方法!!!

    解决Android解析图片的OOM问题的方法!!!

    我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。本篇文章主要讲诉了解决Android解析图片的OOM问题,有兴趣的可以了解一下。
    2016-11-11
  • 源码解析Android Jetpack组件之ViewModel的使用

    源码解析Android Jetpack组件之ViewModel的使用

    Jetpack 是一个丰富的组件库,它的组件库按类别分为 4 类,分别是架构(Architecture)、界面(UI)、 行为(behavior)和基础(foundation)。本文将从源码和大家讲讲Jetpack组件中ViewModel的使用
    2023-04-04
  • Kotlin静态方法的使用浅析

    Kotlin静态方法的使用浅析

    静态方法在其他高级语言(如C++,Java)中也叫类方法。静态方法在调用时无需创建实例,通过类名.方法名的方式调用。在java中调用静态方法的只需在声明前面加关键字static即可。而kotlin中却比较复杂,下面我们来了解一下
    2022-08-08
  • Android ButterKnife依赖注入框架使用教程

    Android ButterKnife依赖注入框架使用教程

    ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广
    2023-02-02
  • Android开发之PopupWindow实现弹窗效果

    Android开发之PopupWindow实现弹窗效果

    这篇文章主要为大家详细介绍了Android开发之PopupWindow实现弹窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 不允许错过的Anndroid技术经验60条

    不允许错过的Anndroid技术经验60条

    不允许错过的Anndroid技术经验60条,与大家分享,希望可以提高大家Android开发水平,感兴趣的朋友可以参考一下
    2016-02-02
  • Android 程序应用的生命周期

    Android 程序应用的生命周期

    本篇文章小编为大家介绍,Android 程序应用的生命周期。需要的朋友参考下
    2013-04-04
  • android教程之hockeyapp捕获异常示例

    android教程之hockeyapp捕获异常示例

    这篇文章主要介绍了android中hockeyapp捕获异常的示例,需要的朋友可以参考下
    2014-02-02

最新评论