国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Android Webview的postUrl與loadUrl加載頁面實例

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

關于Android的webview,用過的想必都不會陌生。這里我就不說webview的基本用法了,想要知道的可以去網上百多,有很多介紹webview基本用法的。

本文要介紹的主要是在項目過程中使用webview的postUrl遇到的坑。

1、使用場景如下:

webview在加載H5鏈接時,默認是使用loadUrl進行加載,如果你設置了緩存屬性(進行緩存),在顯示的H5頁面內點擊跳轉到另外一個頁面后,按回退鍵,可以正常的返回到上一個頁面,因為進行了緩存設置。但是如果使用postUrl進行加載,即使你設置的緩存屬性是進行設置,當你調轉到另外一個頁面后,按回退鍵,不會緩存之前的頁面,而是重新調用postUrl進行加載。這時問題就來了,同樣是進行加載,第一次的postUrl能夠正常加載,重新加載會加載失敗,沒有內容顯示。是不是很有意思,為什么會出現這樣的情況呢,通過抓包發現,雖然加載的是同樣一個鏈接,但是重新加載的請求屬性為空,導致加載失敗。

2、如何解決:

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

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'));

該方法有個缺陷,只在Android 5.0.0以上的Api才有,5.0.0以下的Api是沒有此方法的,這也是一個坑,不能兼容所有機型。通過該方法中的setRequestProperty方法重新設置了請求屬性,然后使用postUrl進行重新加載,可以解決按回退鍵后頁面的重新恢復。注意,由于post加載是不能緩存的,因此在設置緩存屬性時一定要設置成重新加載屬性。

3、解決后出現的問題:

問題看似解決了,但是此方法會有坑。如果你仔細研究該方法,你會發現shouldInterceptRequest方法是在整個加載過中都調用了的。如果你進行抓包,你會發現,從開始加載鏈接到H5頁面中加載的每一個請求,該方法都會被調用,簡單的說就是有多少個請求,該方法就會調用多少次。如果你的頁面中還有一次post請求,那么問題就來了,你需要將第二次post請求的請求內容與第一次的進行對比,對比后選擇到底是加載第一次的頁面,還是加載第二次的頁面,否則就會默認加載第一次的post頁面。

4、結論

webview的H5頁面加載最好使用loadUrl方式,如果使用postUrl方式進行加載,你需要重寫整個setWebViewClient方法,當中會出很多坑,不建議這樣做。

以上這篇Android Webview的postUrl與loadUrl加載頁面實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 亚洲精品免费视频 | 久久精品国产精品青草不卡 | 国产自在线观看 | 欧美日韩在线观看精品 | 欧美丰满大乳大屁股毛片 | 成人性视频在线 | a级毛片在线免费看 | 奇米第四狠狠777高清秒播 | 欧美一级欧美一级毛片 | 国产午夜亚洲精品第一区 | 成人免费视频一区 | 中文字幕一区二区三区视频在线 | 亚洲国产日韩成人综合天堂 | 一级毛片真人不卡免费播 | 日本乱人伦片中文字幕三区 | 欧美国产在线一区 | 成人久久18免费网站 | 精品久久网 | 国产一级片观看 | 99在线精品免费视频 | 在线一区免费播放 | 高清一区二区 | 国产高清在线精品一区a | 性猛交毛片 | 国产精品三级在线播放 | 免费国产成人手机在线观看 | 亚洲第一男人天堂 | 亚洲精品一区二区综合 | 日韩一区二区三区视频在线观看 | 国内成人免费视频 | 亚洲黄色美女视频 | 亚洲综合色一区二区三区小说 | 综合自拍亚洲综合图区美腿丝袜 | 亚洲激情欧美 | 成年人视频在线免费播放 | 国产成人一区二区三区在线播放 | 精品一区二区三区免费毛片爱 | hd最新国产人妖ts视频 | 国产欧美日韩不卡一区二区三区 | 国产久草在线 | 三级手机在线观看 |