av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android Webview的postUrl與loadUrl加載頁(yè)面實(shí)例

瀏覽:106日期:2022-09-25 14:25:13

關(guān)于Android的webview,用過(guò)的想必都不會(huì)陌生。這里我就不說(shuō)webview的基本用法了,想要知道的可以去網(wǎng)上百多,有很多介紹webview基本用法的。

本文要介紹的主要是在項(xiàng)目過(guò)程中使用webview的postUrl遇到的坑。

1、使用場(chǎng)景如下:

webview在加載H5鏈接時(shí),默認(rèn)是使用loadUrl進(jìn)行加載,如果你設(shè)置了緩存屬性(進(jìn)行緩存),在顯示的H5頁(yè)面內(nèi)點(diǎn)擊跳轉(zhuǎn)到另外一個(gè)頁(yè)面后,按回退鍵,可以正常的返回到上一個(gè)頁(yè)面,因?yàn)檫M(jìn)行了緩存設(shè)置。但是如果使用postUrl進(jìn)行加載,即使你設(shè)置的緩存屬性是進(jìn)行設(shè)置,當(dāng)你調(diào)轉(zhuǎn)到另外一個(gè)頁(yè)面后,按回退鍵,不會(huì)緩存之前的頁(yè)面,而是重新調(diào)用postUrl進(jìn)行加載。這時(shí)問(wèn)題就來(lái)了,同樣是進(jìn)行加載,第一次的postUrl能夠正常加載,重新加載會(huì)加載失敗,沒(méi)有內(nèi)容顯示。是不是很有意思,為什么會(huì)出現(xiàn)這樣的情況呢,通過(guò)抓包發(fā)現(xiàn),雖然加載的是同樣一個(gè)鏈接,但是重新加載的請(qǐng)求屬性為空,導(dǎo)致加載失敗。

2、如何解決:

既然找到了原因,請(qǐng)求屬性為空,肯定是有解決辦法的,那就手動(dòng)設(shè)置請(qǐng)求屬性,重新加載。如何手動(dòng)設(shè)置,首先你肯定是要能夠拿到請(qǐng)求的所有內(nèi)容和參數(shù)。用過(guò)webview的人相必都很熟悉它的setWebViewClient方法。該方法內(nèi)部有shouldInterceptRequest方法能夠拿到請(qǐng)求的所有內(nèi)容。不多說(shuō)了,先上代碼。

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if(Build.VERSION.SDK_INT >= 21){ if(!request.getMethod().equalsIgnoreCase('post')){ return super.shouldInterceptRequest(view, request); } } DataOutputStream os = null; try { URL mUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestMethod('POST'); if(Build.VERSION.SDK_INT >= 21){ Iterator headerKeys=request.getRequestHeaders().keySet().iterator(); while(headerKeys.hasNext()){ String key=headerKeys.next(); connection.setRequestProperty(key,request.getRequestHeaders().get(key)); } } connection.setRequestProperty('content-type','application/x-www-form-urlencoded'); os = new DataOutputStream(connection.getOutputStream()); os.write(EncodingUtils.getBytes(postData, 'BASE64')); os.flush(); return new WebResourceResponse('text/html', connection.getContentEncoding(), connection.getInputStream()); } catch (Exception e) { e.printStackTrace(); }finally { if(os!=null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return super.shouldInterceptRequest(view, request); }});webView.postUrl(url, EncodingUtils.getBytes(postData, 'BASE64'));

該方法有個(gè)缺陷,只在Android 5.0.0以上的Api才有,5.0.0以下的Api是沒(méi)有此方法的,這也是一個(gè)坑,不能兼容所有機(jī)型。通過(guò)該方法中的setRequestProperty方法重新設(shè)置了請(qǐng)求屬性,然后使用postUrl進(jìn)行重新加載,可以解決按回退鍵后頁(yè)面的重新恢復(fù)。注意,由于post加載是不能緩存的,因此在設(shè)置緩存屬性時(shí)一定要設(shè)置成重新加載屬性。

3、解決后出現(xiàn)的問(wèn)題:

問(wèn)題看似解決了,但是此方法會(huì)有坑。如果你仔細(xì)研究該方法,你會(huì)發(fā)現(xiàn)shouldInterceptRequest方法是在整個(gè)加載過(guò)中都調(diào)用了的。如果你進(jìn)行抓包,你會(huì)發(fā)現(xiàn),從開(kāi)始加載鏈接到H5頁(yè)面中加載的每一個(gè)請(qǐng)求,該方法都會(huì)被調(diào)用,簡(jiǎn)單的說(shuō)就是有多少個(gè)請(qǐng)求,該方法就會(huì)調(diào)用多少次。如果你的頁(yè)面中還有一次post請(qǐng)求,那么問(wèn)題就來(lái)了,你需要將第二次post請(qǐng)求的請(qǐng)求內(nèi)容與第一次的進(jìn)行對(duì)比,對(duì)比后選擇到底是加載第一次的頁(yè)面,還是加載第二次的頁(yè)面,否則就會(huì)默認(rèn)加載第一次的post頁(yè)面。

4、結(jié)論

webview的H5頁(yè)面加載最好使用loadUrl方式,如果使用postUrl方式進(jìn)行加載,你需要重寫(xiě)整個(gè)setWebViewClient方法,當(dāng)中會(huì)出很多坑,不建議這樣做。

以上這篇Android Webview的postUrl與loadUrl加載頁(yè)面實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 天堂一区二区三区四区 | 亚洲免费在线播放 | 欧美激情黄色 | 国产欧美精品一区二区色综合朱莉 | 北条麻妃国产九九九精品小说 | 欧美日韩大片 | 精品国产成人 | 偷拍自拍网址 | 亚洲一区二区久久久 | 欧美精品久久久久久 | 亚洲不卡在线视频 | 国产欧美一区二区三区久久手机版 | 久久精品免费观看 | 91精品国产欧美一区二区 | 国产乱码高清区二区三区在线 | 国产成人精品免高潮在线观看 | 国产精品五区 | 亚洲第一av| 国产一区二区三区免费视频 | 日本在线看片 | 免费毛片网 | 欧美精品久久久久 | 久久久精彩视频 | 久久久久久久久久久久久久国产 | 我要看黄色录像一级片 | 粉嫩国产精品一区二区在线观看 | 一区二区三区在线看 | 亚洲视频一区在线播放 | 精品免费国产 | 日本久草 | 国产在线一区二区三区 | 免费一区二区三区 | 国产欧美性成人精品午夜 | 久久久久亚洲 | 国产精品久久久久久中文字 | 狠狠久 | 国产视频精品在线 | 五月综合色啪 | 亚洲一区二区免费视频 | 精品九九九 | 久久精品国产免费 |