Android WebView關(guān)于內(nèi)存泄漏疑問及啟動卡頓問題

大嘎好,今天我記錄對于我來說項目中經(jīng)常會遇到的關(guān)于WebView的問題。


猴賽雷

第一先說一下WebView內(nèi)存泄漏的問題,網(wǎng)上收了很多資料,至于內(nèi)存泄漏的原因大致就是WebView會因為一些原因持有Activity里面的引用,并且WebView并不會隨著Activity銷毀而銷毀導(dǎo)致此Activity無法被回收。

處理的方法大致分兩種
一種是通過動態(tài)添加WebView的方式替代直接寫在XML里面,并且上下文對象傳入Application。然后在Activity銷毀時處理一下WebView.代碼如下

 webView = WebView(App.getIns())
        val params = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT
        )
        webView?.layoutParams=params
        webContainer.addView(webView)
        webView?.loadUrl("http://www.itdecent.cn/p/8311410de676")
   override fun onDestroy() {
        val group = webView?.parent as ViewGroup
        group?.removeView(webView)
        webView?.stopLoading()
        webView?.getSettings()?.setJavaScriptEnabled(false);
        webView?.clearHistory();
        webView?.clearView();
        webView?.removeAllViews();
        webView?.destroy();
        super.onDestroy()
    }

第二種方式是通過給含有WebView的Activity配置新進程,并在這個Activity銷毀的時候調(diào)用
System.exit(0)
來強制關(guān)閉這個進程,這個方法可以說是非常暴力非常直接。


下面說一下遇到的第二個問題, 在startActivity到含有WebView的Activity時,第一次跳轉(zhuǎn)會有明顯的卡頓。手機性能越差這個卡頓越明顯。

一想到卡頓第一反應(yīng)就是主線程做了耗時操作,于是我機智的想開個子線程去創(chuàng)建WebView然后在主線程中再去AddView添加到視圖上。。。。然后我就這么操作了


結(jié)果報了這么一個錯
java.lang.RuntimeException: WebView cannot be initialized on a thread that has no Looper.
好吧。子線程中肯定行不通的,然后我又機智的想到能不能等跳轉(zhuǎn)Activity完成之后再加載WebView.

那么把添加WebView的時機放到onWindowFocusChanged

override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus&&isFirst){
            webView = WebView(App.getIns())

            val params = LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT
            )
            webView?.layoutParams=params
            webContainer.addView(webView)
            webView?.loadUrl("http://www.itdecent.cn/p/8311410de676")
        }
    }

然后測試了一下有效果了,但是效果只能說一般,跳轉(zhuǎn)速度大概快了一半。考慮了一下可能還是因為onWindowFocusChanged不夠靠后,那么干脆一點 我們直接做一個200毫秒的延遲試一試

        Observable.interval(200,TimeUnit.MILLISECONDS)
            .take(1)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnComplete {
                initWebView()
            }
            .subscribe()

測了一下,效果很棒,Activity是打到了瞬開,至于WebView的加載時機反正本菜雞這里設(shè)置的是200毫秒,我能接受這個延遲,大家也可以自己再減一點測試一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容