一,webView的常見的一些坑;
二,關(guān)于webView的內(nèi)存泄露問題;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一,webView之前的坑
1,API16以及之前的版本存在著遠程代碼執(zhí)行安全漏洞。該漏洞源于程序沒有正確使用webView.addJavascriptInterface方法,遠程攻擊者可以通過使用Java? Reflection? API利用該漏洞執(zhí)行任意java對象的方法。(即利用反射機制攻擊其他為注冊的java類)
2,webView在布局文件中的使用:webView寫在其他的容器中時:
利用addView動態(tài)將webView添加入容器中,
當(dāng)銷毀時,要在onDestory()方法中把webView銷毀,然后才能真正地銷毀整個webView。
具體銷毀的步驟:
先把容器中的webView調(diào)用remove方法移除,即到onDestory()方法中調(diào)用webView的removeAllViews();,和webView的destory方法;
轉(zhuǎn)載:以下是Android避免WebView內(nèi)存泄漏的方法
原文:https://blog.csdn.net/weixin_34323858/article/details/88157190
@Override
protected void onDestroy() {
super.onDestroy();
if (mWebView != null) {
//加載null內(nèi)容
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
//清除歷史記錄
mWebView.clearHistory();
//移除WebView
((ViewGroup) mWebView.getParent()).removeView(mWebView);
//銷毀VebView
mWebView.destroy();
//WebView置為null
mWebView = null;
}
}
收藏:webview內(nèi)存泄漏終極解決方案
http://www.itdecent.cn/p/aa5a99b565e7
該博文介紹了關(guān)于webview內(nèi)存泄漏的一些方法,其中講到,上面的方法其實沒有太多作用,因此她采用了:
1,另起一個進程加載webview,頁面銷毀后干掉這個進程。(用于webview業(yè)務(wù)邏輯間沒有交互的情況),但另起一個進程,要占用CPU時間,主進程需要等待接受信息,那么勢必會慢一些。
2,文中還利用了一些實例進行介紹。
webview的一些相關(guān)的知識和問題
1,jsbridge:讓本地的navi端可調(diào)用遠端的js代碼,可以遠端web調(diào)用本地的navi
2,webViewClient.onPageFinished - > webChromeClient.onProgressChanged
前一個方法是加載完成回調(diào)時:用于判斷是否加載,若加載中跳轉(zhuǎn),則會調(diào)用無數(shù)次
后一個方法則時加載多次,且有操作,靠譜。
3,后臺耗電:
? webView自己開線程,殘余線程留著,耗電居高不下,在Activity的onDestory()方法中直接調(diào)用System.exit()方法,可以銷毀掉webView,且直接關(guān)虛擬機
4,webView硬件加速導(dǎo)致頁面渲染問題
安卓3.0開始硬件加速,容易出現(xiàn)界面閃爍,頁面白塊,可以通過設(shè)置webView展示關(guān)閉硬件加速來解決問題。
? ? ? ? ? ? ? ? ? ? ? ? ? ? 三,關(guān)于webView內(nèi)存泄漏問題
1,解決webView內(nèi)存泄漏的問題的方法:
? ? ? ? ? ? ? ?開啟獨立進程,簡單粗暴,不過可能會涉及到進程間的通信。
問題的描述:
? ? ? ? ? ?1,webView關(guān)聯(lián)Activity? ? ?
=>? ? ?2,內(nèi)部? ??
=>? ? ?3,在新線程中,時間無法確定 。導(dǎo)致webView不能一直持有Activity的引用,因此沒有辦? ? ? ? ? ? ? ? 法回收。
? ? ? ? ? 原因:Activity的生命周期和新線程webView的生命周期不一樣。
原理:
? ? ? ? ? ? 匿名內(nèi)部類持有外部類的引用,導(dǎo)致外部類無法回收。
關(guān)鍵詞:? ? 獨立進程,進程間通信
2,動態(tài)添加webView,對傳入webview中使用的Context使用弱引用,動態(tài)添加webView,意思是在布局創(chuàng)建webGroup用來放置webView,Activity創(chuàng)建時add進來,在activity停止(即銷毀)時,remove掉。