最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年03月25日 10:03:06   作者:爅烆  
這篇文章主要介紹了Android Webview的postUrl與loadUrl加載頁(yè)面實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

關(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

溆浦县| 巩留县| 永康市| 宁陵县| 历史| 正阳县| 辉县市| 思茅市| 涿鹿县| 忻城县| 霍城县| 万山特区| 南皮县| 巴林左旗| 盐源县| 延庆县| 古蔺县| 通州市| 清河县| 睢宁县| 剑河县| 哈密市| 满城县| 彝良县| 斗六市| 南安市| 焦作市| 陆河县| 平谷区| 邯郸市| 临颍县| 武川县| 葵青区| 舟曲县| 栾城县| 筠连县| 石泉县| 梁平县| 武平县| 阳东县| 南木林县|