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

背景:

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)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900421.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm搭配miniConda(Anaconda的轻量版本)建立虚拟环境管理不同项目不同依赖

需求 pip安装的版本会在全局环境下生效,导致不用的项目使用的是同一套环境,容易出现别人的项目跑的好好的,到了自己电脑就不能跑的问题需求 1.不同的项目可以设置不同的环境,同时支持自动切换环境2.便捷,轻量化管理当前的环境 如果可以,最好有一个可视化的平台,anaconda倒是支…

图像分割-DeepLab

DeepLabV3源码链接:https://github.com/bubbliiiing/deeplabv3-plus-pytorch(打不开私信我获取) 一、简介 一般的模型如Unet一般用于医学领域,小目标,如细胞分割。 为了增大感受野(从而更好的获得全局特征…

docker 镜像详解

Docker镜像是一种轻量级、可移植的软件打包格式,它包含了运行应用程序所需的一切,是构建和分发应用程序的基础。以下是对Docker镜像的详细解释: 一、镜像的定义 镜像本质上是一个只读文件,包含了文件系统、源码、库文件、依赖、…

wordcloud 字体报错

wordcloud 字体报错 词云库报错:Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题(我的最终解决方案) 词云库报错:Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

【CSS3】css开篇基础(4)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表

一、目的 在完成错误数据表任务后,需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下,金融行业的转型升级是热门话题,创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展,它们与金融领域的深度融合,正引领着新型…

uniapp:sqlite最详细教程,小白可直接粘贴复制

新建uniapp项目,需要4个页面, loading 启动页:打开数据库,判断数据表是否存在,表内是否有数据,创建数据表的逻辑。 register 注册页:数据表已存在,但是没有数据,需要进入该页面注册第一条数据 index 首页:展示数据列表内的数据,可修改默认,添加新数据 edit 编辑:编…

linux面试题复习

前言 现在只是初版,很多格式我还没有改好,会慢慢修改订正。 可能用到的网址:在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题: 参考文档: 程序员的50大Linux面试问题及答案 Top 60 Linux …

机床发那科转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集发那科机床数据 2 5 用PROFINET IO协议转发数据 5 6 案例总结 7 1 案例说明 设置网关采集发那科机床数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&a…

【安当产品应用案例100集】024-BYOE及BYOK在IaaS场景中的应用

在云计算环境中,尤其是涉及到敏感数据时,企业用户可能会选择自带加密工具或密钥(即BYOE或BYOK),以确保数据在传输和存储过程中的安全性。这种方式可以防止云服务提供商访问或泄露加密数据,增强数据保护。 …

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提…

基于Java+Springboot+Vue开发的鲜花商城管理系统

项目简介 该项目是基于JavaSpringbootVue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜…

网络服务请求流程简单理解

网络流程: DNS负责将域名解析为IP地址,ALB可以在多个服务实例之间分配流量,APISIX作为API网关处理更细粒度的流量管理,Service在Kubernetes中为Pod提供稳定的访问入口,而Kubernetes则负责整个应用的部署、扩展和运维。…

基于STM32F103的LED闪烁仿真-定时器中断方式

基于STM32F103的LED闪烁仿真 仿真软件: Proteus 8.17 编程软件: Keil 5 定时器简介: 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。 它适合多种用途,包含测量输入信…

FastGPT学习(2)- 本地开发通过Navicat管理MongoDB、PostgreSQL数据库

1. 背景 前期已经完成FastGPT的本地化部署工作,通过Docker启动FastGPT的相关容器即可运行。(共6个容器) 2.本地化开发 2.1 前置依赖 2.2 源码拉取 git clone gitgithub.com:labring/FastGPT.git2.3 数据库管理 本地化运行的FastGPT使用…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题,找中间节点和逆置链表(翻转链表)之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到,想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

‘perl‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

‘perl’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 明明已经根据教程安装了perl环境,但是在cmd中依赖报该错误,本章教程提供解决办法。 一、激活perl环境 state shell ActiveState-Perl-5.36.0此时输入perl -v 是可以直接输出perl版本号的。 二、找到perl的执…

跨域的几种情况和如何解决跨域问题

在网站开发中,经常会遇到跨域问题,下面总结一下集中常见的跨域问题。 1. 不同域名属于跨域,如:www.a.com 和www.b.com,另外www.a.com 和www.a.com.cn也属于不同域名。 2. 主域名和子域名(二级域名、三级域…