91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android Webview中postUrl與loadUrl加載頁面的示例

發布時間:2021-05-08 09:32:53 來源:億速云 閱讀:211 作者:小新 欄目:移動開發

這篇文章主要介紹Android Webview中postUrl與loadUrl加載頁面的示例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。

本文要介紹的主要是在項目過程中使用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加載頁面的示例”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芒康县| 堆龙德庆县| 乃东县| 当涂县| 米易县| 鄱阳县| 南充市| 黄冈市| 平顺县| 黔江区| 肃宁县| 龙南县| 鸡西市| 资兴市| 江城| 景德镇市| 扶风县| 天峻县| 呼图壁县| 曲阳县| 社会| 东乡县| 随州市| 玉山县| 杭锦后旗| 沈阳市| 民和| 河曲县| 宜兴市| 伊春市| 海原县| 舞阳县| 洮南市| 交口县| 中江县| 霸州市| 蓬溪县| 五家渠市| 汕尾市| 锡林浩特市| 通渭县|