最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WebView渲染異常導(dǎo)致閃退問題的解決方案

 更新時間:2025年02月27日 10:37:29   作者:封妖九禁蒼天泣  
這篇文章主要介紹了WebView渲染異常導(dǎo)致閃退問題的解決方案,文中通過設(shè)置WebViewClient重寫onRenderProcessGone()方法并移除、重新創(chuàng)建Web容器來解決該問題,需要的朋友可以參考下

背景:

App主頁面使用了大量WebView容器(10個以上)顯示圖表信息,最新發(fā)現(xiàn)bugly上面出現(xiàn)一些關(guān)于瀏覽器Native Crash,如下:

經(jīng)排查,是WebView渲染失敗導(dǎo)致Crash,可以通過webView.loadUrl("chrome://crash")模擬。

解決方法:

1、通過設(shè)置WebViewClient,重寫onRenderProcessGone()返回值,強制返回true,表示在WebView發(fā)生異常時,自己處理,這樣App就不會出現(xiàn)Crash。這么做App雖然沒有Crash,但是主頁面的WebView內(nèi)容卻看不到了,看到的是白色/黑色背景,體驗極差。

2、要想解決WebView內(nèi)容不可見問題,還需要在Web出現(xiàn)異常的時候,移除原有Web容器,重新創(chuàng)建一個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()// 銷毀

        // 重新創(chuàng)建 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三方庫,在創(chuàng)建Web容器需要設(shè)置addJavascriptObject(),即reloadFun函數(shù)。

注意事項:

1、同一個頁面只要有一個渲染異常,會導(dǎo)致所有Web容器異常,所以所有Web容器都要重新創(chuàng)建,不可以根據(jù)Web可見狀態(tài)只創(chuàng)建可見的Web。

2、在使用的時候,原有的Web容器已被移除,需要使用最新的Web容器,否則就會報錯。上述代碼中,新的Web容器id跟移除的一樣,所以也很容易拿到新的Web容器,代碼如下:

/**
 * 獲取真實的webView,之前的web可能被銷毀
 * @param id web id
 */
private fun getRealWebView(id: Int): ReportWebView {
    return mBinding.root.findViewById(id)
}

總結(jié) 

到此這篇關(guān)于WebView渲染異常導(dǎo)致閃退問題解決方案的文章就介紹到這了,更多相關(guān)WebView渲染異常閃退內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Android如何解決虛擬按鍵欄遮擋問題

    Android如何解決虛擬按鍵欄遮擋問題

    這篇文章主要介紹了Android如何解決虛擬按鍵欄遮擋問題,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-03-03
  • Android 5.0及以上編程實現(xiàn)屏幕截圖功能的方法

    Android 5.0及以上編程實現(xiàn)屏幕截圖功能的方法

    這篇文章主要介紹了Android 5.0及以上編程實現(xiàn)屏幕截圖功能的方法,結(jié)合實例形式分析了Android5.0以上實現(xiàn)截圖功能的相關(guān)類、函數(shù)及權(quán)限控制等操作技巧,需要的朋友可以參考下
    2018-01-01
  • 解決Android解析圖片的OOM問題的方法!!!

    解決Android解析圖片的OOM問題的方法!!!

    我們在編寫Android程序的時候經(jīng)常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,程序占用了過高的內(nèi)存就容易出現(xiàn)OOM(OutOfMemory)異常。本篇文章主要講訴了解決Android解析圖片的OOM問題,有興趣的可以了解一下。
    2016-11-11
  • 源碼解析Android Jetpack組件之ViewModel的使用

    源碼解析Android Jetpack組件之ViewModel的使用

    Jetpack 是一個豐富的組件庫,它的組件庫按類別分為 4 類,分別是架構(gòu)(Architecture)、界面(UI)、 行為(behavior)和基礎(chǔ)(foundation)。本文將從源碼和大家講講Jetpack組件中ViewModel的使用
    2023-04-04
  • Kotlin靜態(tài)方法的使用淺析

    Kotlin靜態(tài)方法的使用淺析

    靜態(tài)方法在其他高級語言(如C++,Java)中也叫類方法。靜態(tài)方法在調(diào)用時無需創(chuàng)建實例,通過類名.方法名的方式調(diào)用。在java中調(diào)用靜態(tài)方法的只需在聲明前面加關(guān)鍵字static即可。而kotlin中卻比較復(fù)雜,下面我們來了解一下
    2022-08-08
  • Android?ButterKnife依賴注入框架使用教程

    Android?ButterKnife依賴注入框架使用教程

    ButterKnife是一個專注于Android系統(tǒng)的View注入框架,以前總是要寫很多findViewById來找到View對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣
    2023-02-02
  • Android開發(fā)之PopupWindow實現(xiàn)彈窗效果

    Android開發(fā)之PopupWindow實現(xiàn)彈窗效果

    這篇文章主要為大家詳細介紹了Android開發(fā)之PopupWindow實現(xiàn)彈窗效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 不允許錯過的Anndroid技術(shù)經(jīng)驗60條

    不允許錯過的Anndroid技術(shù)經(jīng)驗60條

    不允許錯過的Anndroid技術(shù)經(jīng)驗60條,與大家分享,希望可以提高大家Android開發(fā)水平,感興趣的朋友可以參考一下
    2016-02-02
  • Android 程序應(yīng)用的生命周期

    Android 程序應(yīng)用的生命周期

    本篇文章小編為大家介紹,Android 程序應(yīng)用的生命周期。需要的朋友參考下
    2013-04-04
  • android教程之hockeyapp捕獲異常示例

    android教程之hockeyapp捕獲異常示例

    這篇文章主要介紹了android中hockeyapp捕獲異常的示例,需要的朋友可以參考下
    2014-02-02

最新評論

涡阳县| 普陀区| 桐梓县| 石城县| 文安县| 鸡东县| 吕梁市| 门源| 伊金霍洛旗| 洛川县| 翁牛特旗| 海伦市| 和顺县| 泽库县| 南涧| 元江| 喜德县| 广昌县| 金湖县| 瓮安县| 东山县| 建平县| 临高县| 扎兰屯市| 昭苏县| 万年县| 伊宁市| 景德镇市| 东至县| 昭觉县| 广西| 光泽县| 崇左市| 沁源县| 湖北省| 札达县| 天津市| 贵溪市| 陆川县| 宁河县| 临海市|