前言
這周在做一個(gè)需求時(shí),需要用到WebView砾层,但是在做的過程中,卻遇到了一些問題拴泌。WebView我其實(shí)接觸并不多魏身,這次的需求里還涉及了一些JS交互之類的,所以我是邊學(xué)邊做蚪腐,但是網(wǎng)上的示例和教程箭昵,往往藏著一些坑,這一次我就發(fā)現(xiàn)關(guān)于shouldOverrideUrlLoading這個(gè)方法回季,網(wǎng)上的說法真的是五花八門宙枷,這篇文章,我們來澄清一下shouldOverrideUrlLoading的真正用法茧跋。
正文
- 關(guān)于shouldOverrideUrlLoading用法的誤解慰丛,主要還是集中在返回值上。
- 錯(cuò)誤說法1:返回true就調(diào)用系統(tǒng)瀏覽器瘾杭,返回false由WebView處理诅病。
- 錯(cuò)誤說法2:返回true當(dāng)前url即使是重定向url也不會(huì)再執(zhí)行,返回false由系統(tǒng)執(zhí)行url粥烁,直到不再執(zhí)行此方法贤笆。
- 錯(cuò)誤說法3:WebView上的所有加載都經(jīng)過這個(gè)方法。
- 錯(cuò)誤說法4:這是一種廣為流傳的用法讨阻,在shouldOverrideUrlLoading中
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
便可以在WebView中加載該url芥永。
- 那么我們來看看官方文檔是怎么說的:
/**
* Give the host application a chance to take over the control when a new
* url is about to be loaded in the current WebView. If WebViewClient is not
* provided, by default WebView will ask Activity Manager to choose the
* proper handler for the url. If WebViewClient is provided, return true
* means the host application handles the url, while return false means the
* current WebView handles the url.
* This method is not called for requests using the POST "method".
*
* @param view The WebView that is initiating the callback.
* @param url The url to be loaded.
* @return True if the host application wants to leave the current WebView
* and handle the url itself, otherwise return false.
* @deprecated Use {@link #shouldOverrideUrlLoading(WebView, WebResourceRequest)
* shouldOverrideUrlLoading(WebView, WebResourceRequest)} instead.
*/
大致翻譯一下:
- 若沒有設(shè)置 WebViewClient 則由系統(tǒng)(Activity Manager)處理該 url,通常是使用瀏覽器打開或彈出瀏覽器選擇對話框钝吮。
- 若設(shè)置 WebViewClient 且該方法返回 true 埋涧,則說明由應(yīng)用的代碼處理該 url,WebView 不處理奇瘦,也就是程序員自己做處理棘催。
- 若設(shè)置 WebViewClient 且該方法返回 false,則說明由 WebView 處理該 url耳标,即用 WebView 加載該 url醇坝。
- 所以上面的說法1和說法2都是錯(cuò)誤的。對于說法4次坡,直接返回false即可達(dá)到同樣的效果呼猪。
至于說法3,我在斷點(diǎn)調(diào)試的時(shí)候就已經(jīng)發(fā)現(xiàn)不對了砸琅,并不會(huì)每次加載都走shouldOverrideUrlLoading宋距,但是文檔里并沒有說shouldOverrideUrlLoading真正的調(diào)用時(shí)機(jī)是什么,所以我繼續(xù)在網(wǎng)上查找明棍,終于找到一篇源碼分析乡革,得出結(jié)論:
WebView的前進(jìn)、后退、刷新沸版、以及post請求都不會(huì)調(diào)用shouldOverrideUrlLoading方法嘁傀,除去以上行為,還得滿足( ! isLoadUrl || isRedirect) 即 (不是通過webView.loadUrl來加載的 或者 是重定向) 這個(gè)條件视粮,才會(huì)調(diào)用shouldOverrideUrlLoading方法细办。
結(jié)語
通過這件事,讓我在網(wǎng)上查找資料的時(shí)候更加謹(jǐn)慎了蕾殴,因?yàn)橐呀?jīng)不是第一次出現(xiàn)這種情況了笑撞。廣為流傳的錯(cuò)誤答案,千篇一律的復(fù)制粘貼钓觉。這對于初學(xué)者來說茴肥,往往會(huì)造成嚴(yán)重的誤導(dǎo)和困惑。所以我們在寫東西的時(shí)候荡灾,也要更加慎重瓤狐,不要把自己都沒弄清楚的東西,當(dāng)成結(jié)論發(fā)表出來批幌,更不要不加思考的去復(fù)制粘貼別人的東西础锐。理所應(yīng)當(dāng)?shù)模疚闹械慕Y(jié)論荧缘,都是筆者在網(wǎng)上查資料皆警,并且結(jié)合官方文檔和源碼,然后自己寫程序驗(yàn)證過的截粗,目的是為了讓更多的初學(xué)者不被誤導(dǎo)信姓。當(dāng)然了,人無完人桐愉,如果文中出現(xiàn)有誤的地方财破,也歡迎大家指正。