WebView常用方法
void loadUrl(String url):加載網(wǎng)絡(luò)鏈接 url
boolean canGoBack():判斷 WebView 當(dāng)前是否可以返回上一頁(yè)
goBack():回退到上一頁(yè)
boolean canGoForward():判斷 WebView 當(dāng)前是否可以向前一頁(yè)
goForward():回退到前一頁(yè)
onPause():類似 Activity 生命周期魄懂,頁(yè)面進(jìn)入后臺(tái)不可見狀態(tài)
pauseTimers():該方法面向全局整個(gè)應(yīng)用程序的webview沿侈,它會(huì)暫停所有webview的layout,parsing市栗,JavaScript Timer缀拭。當(dāng)程序進(jìn)入后臺(tái)時(shí),該方法的調(diào)用可以降低CPU功耗填帽。
onResume():在調(diào)用 onPause()后蛛淋,可以調(diào)用該方法來(lái)恢復(fù) WebView 的運(yùn)行。
resumeTimers():恢復(fù)pauseTimers時(shí)的所有操作篡腌。(注:pauseTimers和resumeTimers 方法必須一起使用褐荷,否則再使用其它場(chǎng)景下的 WebView 會(huì)有問(wèn)題)
destroy():銷毀 WebView
clearHistory():清除當(dāng)前 WebView 訪問(wèn)的歷史記錄。
clearCache(boolean includeDiskFiles):清空網(wǎng)頁(yè)訪問(wèn)留下的緩存數(shù)據(jù)嘹悼。需要注意的時(shí)叛甫,由于緩存是全局的层宫,所以只要是WebView用到的緩存都會(huì)被清空,即便其他地方也會(huì)使用到其监。該方法接受一個(gè)參數(shù)萌腿,從命名即可看出作用。若設(shè)為false抖苦,則只清空內(nèi)存里的資源緩存毁菱,而不清空磁盤里的。
reload():重新加載當(dāng)前請(qǐng)求
setLayerType(int layerType, Paint paint):設(shè)置硬件加速锌历、軟件加速
removeAllViews():清除子view鼎俘。
clearSslPreferences():清除ssl信息。
clearMatches():清除網(wǎng)頁(yè)查找的高亮匹配字符辩涝。
removeJavascriptInterface(String interfaceName):刪除interfaceName 對(duì)應(yīng)的注入對(duì)象
addJavascriptInterface(Object object,String interfaceName):注入 java 對(duì)象贸伐。
setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled):設(shè)置垂直方向滾動(dòng)條。
setHorizontalScrollBarEnabled(boolean horizontalScrollBarEnabled):設(shè)置橫向滾動(dòng)條怔揩。
loadUrl(String url, Map<String, String> additionalHttpHeaders):加載制定url并攜帶http header數(shù)據(jù)捉邢。
evaluateJavascript(String script, ValueCallback<String> resultCallback):Api 19 之后可以采用此方法之行 Js。
stopLoading():停止 WebView 當(dāng)前加載商膊。
clearView():在Android 4.3及其以上系統(tǒng)這個(gè)api被丟棄了伏伐, 并且這個(gè)api大多數(shù)情況下會(huì)有bug,經(jīng)常不能清除掉之前的渲染數(shù)據(jù)晕拆。官方建議通過(guò)loadUrl("about:blank")來(lái)實(shí)現(xiàn)這個(gè)功能藐翎,陰雨需要重新加載一個(gè)頁(yè)面自然時(shí)間會(huì)收到影響。
freeMemory():釋放內(nèi)存实幕,不過(guò)貌似不好用吝镣。
clearFormData():清除自動(dòng)完成填充的表單數(shù)據(jù)。需要注意的是昆庇,該方法僅僅清除當(dāng)前表單域自動(dòng)完成填充的表單數(shù)據(jù)末贾,并不會(huì)清除WebView存儲(chǔ)到本地的數(shù)據(jù)。
WebView優(yōu)化方案
1.WebView 動(dòng)態(tài)加載
WebView 動(dòng)態(tài)加載整吆。就是不在xml中寫WebView拱撵,寫一個(gè)layout,然后把WebView add進(jìn)去表蝙。
WebView mWebView = new WebView(getApplicationgContext());
LinearLayout mll = findViewById(R.id.xxx);
mll.addView(mWebView);
然后:
protected void onDestroy() {
super.onDestroy();
mWebView.removeAllViews();
mWebView.destroy()
}
這里用的getApplicationContext()也是防止內(nèi)存溢出拴测,這種方法有一個(gè)問(wèn)題。如果你需要在WebView中打開鏈接或者你打開的頁(yè)面帶有flash府蛇,獲得你的WebView想彈出一個(gè)dialog集索,都會(huì)導(dǎo)致從ApplicationContext到ActivityContext的強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤,從而導(dǎo)致你應(yīng)用崩潰。這是因?yàn)樵诩虞dflash的時(shí)候抄谐,系統(tǒng)會(huì)首先把你的WebView作為父控件,然后在該控件上繪制flash扰法,他想找一個(gè)Activity的Context來(lái)繪制他蛹含,但是你傳入的是ApplicationContext。然后就崩潰了塞颁。浦箱。。
2.獨(dú)立的web進(jìn)程祠锣,與主進(jìn)程隔開
這個(gè)方法被運(yùn)用于類似qq酷窥,微信這樣的超級(jí)app中,這也是解決任何webview內(nèi)存問(wèn)題屢試不爽的方法 對(duì)于封裝的webactivity伴网,在manifest.xml
中設(shè)置
<activity android:name=".webview.WebViewActivity" android:launchMode="singleTop" android:process=":remote" android:screenOrientation="unspecified" />
然后在關(guān)閉webactivity時(shí)銷毀進(jìn)程
@Overrideprotected void onDestroy() {
super.onDestroy();
System.exit(0);
}
關(guān)閉瀏覽器后便銷毀整個(gè)進(jìn)程蓬推,這樣一般95%
的情況下不會(huì)造成內(nèi)存泄漏之類的問(wèn)題,但這就涉及到android進(jìn)程間通訊澡腾,比較不方便處理沸伏, 優(yōu)劣參半,也是可選的一個(gè)方案.
WebView釋放
完整的代碼如下:
public void destroy() {
if (mWebView != null) {
// 如果先調(diào)用destroy()方法动分,則會(huì)命中if (isDestroyed()) return;這一行代碼毅糟,需要先onDetachedFromWindow(),再
// destory()
ViewParent parent = mWebView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(mWebView);
}
?
mWebView.stopLoading();
// 退出時(shí)調(diào)用此方法澜公,移除綁定的服務(wù)姆另,否則某些特定系統(tǒng)會(huì)報(bào)錯(cuò)
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.clearHistory();
mWebView.clearView();
mWebView.removeAllViews();
?
try {
mWebView.destroy();
} catch (Throwable ex) {
?
}
}
}
更多文章
其他解決方案
Hybrid方案