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

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

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

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

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

1、使用場景如下:

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

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、解決后出現的問題:

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

4、結論

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

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

相關文章

  • Flutter之自定義Dialog實現版本更新彈窗功能的實現

    Flutter之自定義Dialog實現版本更新彈窗功能的實現

    這篇文章主要介紹了Flutter之自定義Dialog實現版本更新彈窗功能的實現,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • android實現listview分頁的方法

    android實現listview分頁的方法

    這篇文章主要介紹了android實現listview分頁的方法,涉及Android生成listview列表的相關技巧,需要的朋友可以參考下
    2015-05-05
  • android圖像繪制(四)自定義一個SurfaceView控件

    android圖像繪制(四)自定義一個SurfaceView控件

    自定義控件(類似按鈕等)的使用,自定義一個SurfaceView。如某一塊的動態(tài)圖(自定義相應),或者類似UC瀏覽器下面的工具欄,感興趣的朋友可以了解下
    2013-01-01
  • Android Studio 3.6 正式版終于發(fā)布了,快來圍觀

    Android Studio 3.6 正式版終于發(fā)布了,快來圍觀

    Android Studio 3.6 正式版終于發(fā)布了,值得興奮呀,畢竟 3.5 大版本更新也已經差不多半年了,撒花撒花!這次更新又更新了什么呢?快來跟隨小編一起看看吧
    2020-02-02
  • 深入解析Android App的LayoutInflate布局

    深入解析Android App的LayoutInflate布局

    這篇文章主要介紹了Android App的LayoutInflate布局,對LayoutInflate編寫中經常被無解及產生錯誤的地方進行了深入說明,需要的朋友可以參考下
    2016-04-04
  • Android實現朋友圈評論回復列表

    Android實現朋友圈評論回復列表

    這篇文章主要為大家詳細介紹了Android實現朋友圈評論回復列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android編程設計模式之解釋器模式詳解

    Android編程設計模式之解釋器模式詳解

    這篇文章主要介紹了Android編程設計模式之解釋器模式,詳細分析了Android解釋器模式的概念、原理、使用場景、使用方法及相關操作注意事項,需要的朋友可以參考下
    2017-12-12
  • Android自定義View onDraw()方法會調用兩次的問題解決

    Android自定義View onDraw()方法會調用兩次的問題解決

    這篇文章主要介紹了Android自定義View onDraw()方法會調用兩次的問題解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Android基于API的Tabs3實現仿優(yōu)酷t(yī)abhost效果實例

    Android基于API的Tabs3實現仿優(yōu)酷t(yī)abhost效果實例

    這篇文章主要介紹了Android基于API的Tabs3實現仿優(yōu)酷t(yī)abhost效果,結合完整實例形式分析了Android實現優(yōu)酷界面效果的相關技巧,需要的朋友可以參考下
    2015-12-12
  • Android?利用OpenCV制作人臉檢測APP

    Android?利用OpenCV制作人臉檢測APP

    本篇文章手把手教大家使用OpenCV來實現一個能在安卓手機上運行的人臉檢測APP。其實不僅僅是能檢測人臉,還能檢測鼻子,嘴巴,眼睛和耳朵。需要的朋友可以參考一下
    2021-12-12

最新評論

印江| 荔波县| 岳阳县| 清远市| 三门峡市| 军事| 新田县| 鹤峰县| 城步| 贵南县| 肇州县| 长岭县| 前郭尔| 西青区| 蓝田县| 囊谦县| 东平县| 诏安县| 哈尔滨市| 抚宁县| 花莲县| 禄劝| 南靖县| 雅安市| 禄丰县| 清流县| 紫阳县| 呼玛县| 达拉特旗| 马尔康县| 龙里县| 封开县| 清涧县| 玉门市| 桐乡市| 沛县| 临漳县| 怀安县| 绥德县| 沙河市| 共和县|