大嘎好,今天我記錄對于我來說項目中經(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毫秒,我能接受這個延遲,大家也可以自己再減一點測試一下。
