Android WebviewのpostUrlとloadUrlのローディングページの例


Androidのwebviewについて、使ったことがあるのはきっとすべてよく知っていることはできません。ここではwebviewの基本的な使い方を言いません。知りたいのはネットで百余り行けます。webviewの基本的な使い方を紹介するものがたくさんあります。
本稿で紹介するのは主にプロジェクトの過程でwebviewを使ったpostUrlが出会うピットです。
1、使用シーンは以下の通りです。
webviewはH 5リンクをロードする時、デフォルトではloadUrlを使ってロードします。キャッシュ属性を設定したら、表示されているH 5ページ内でクリックして別のページにジャンプしてから、リターンキーを押して、正常に前のページに戻ります。ただし、postUrlを使ってローディングすると、設定されたキャッシュ属性が設定されていても、別のページに転送された後、キャンセルボタンを押して、キャッシュ前のページではなく、postUrlを呼び出してローディングします。この時問題が来ました。同じローディングをしていますが、初めてのpostUrlは正常にローディングできます。再ローディングは失敗します。内容表示はありません。面白いですね。なぜこのような状況が発生したのですか?クローズドによって、同じリンクがロードされていますが、再ロードされた要求属性が空です。ロードに失敗しました。
2、どう解決しますか
原因が見つかった以上、要求属性は空です。解決策があります。手動で要求属性を設定して再読み込みします。どのように手動で設定するかは、まず必ず要求されたすべての内容とパラメータを得ることができます。webviewを使ったことがある人は、必ずそのset Webview Cientの方法をよく知っています。この方法の内部には、要求されたすべての内容を得ることができるshuldIntercept Request法がある。多く言わないで、先にコードをつけます。

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.000以上のAppにだけあります。5.00以下のAppにはこの方法がありません。これも一つのピットです。すべての機種に対応できません。この方法のset Request Property方法により要求属性を再設定し、postUrlを使って再ロードすることで、リターキーを押した後のページの再生を解決することができます。なお、ポストローディングはキャッシュできませんので、キャッシュ属性を設定する際には、必ず属性を再読み込みするように設定してください。
3、解決後の問題:
問題は解決したように見えますが、この方法には穴があります。この方法を詳しく研究すれば、ロード全体にわたって呼び出されたショルドIntercept Request方法が発見されます。クローズドを行うと、H 5ページにロードされた各要求をロードし始めると、この方法はコールされます。簡単に言えば、いくつかの要求があります。この方法は何回呼び出すことができますか?もしあなたのページの中にもう一回のポスト要求があると問題が来ます。第二回のポストの要求内容を第一回の要求内容と比較して、比較後に最初のページをロードするか、それとも第二回のページをロードするかを選択します。
4、結論
webviewのH 5ページのローディングはloadUrl方式が一番いいです。もしpostUrl方式を使ってローディングするなら、set Webview client全体を書き換える必要があります。中には多くのピットがあります。このようにすることを勧めません。
以上のAndroid WebviewのpostUrlとloadUrlのページローディングの例は、小編集が皆さんに共有している内容の全部です。参考にしていただきたいです。どうぞよろしくお願いします。