web-dev-qa-db-ja.com

shouldoverrideurlloadingとshouldinterceptrequestの違いは?

誰でもメソッドpublic WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)public boolean shouldOverrideUrlLoading(WebView view, String url)の違いを教えてください。

WebViewのクリックイベントの応答として文字列が取得されるAndroidアプリケーションを作成しています。この文字列を保存して表示したいのです。これらのメソッドの両方。私はshouldOverrideUrlLoadingにロードし、メニューをクリックしたURLとしてgoogle.comを使用してサンプルアプリを作成することを確認したときにリダイレクトURLを返すWebViewを使用しようとしました。

誰もが両方の方法の違いと私がどちらを使用するべきか教えてもらえますか?

27
Nevaeh

Android WebKit実装により、開発者は WebView を介して Android.webkit.WebSettings クラスを変更できます。

  • JavaScriptのサポート、
  • プラグインのサポート、
  • ファイルシステムアクセス、
  • リソース検査など.

Resource Inspectionでは、shouldOverrideUrlLoadingおよびshouldInterceptRequestメソッド。

しかし、上記の2つの方法は、次のような異なる目的で使用されます。

1 .shouldOverrideUrlLoadingは新しいページが開かれようとするときに呼び出されますが、shouldInterceptRequestはcssファイル、jsファイルなどのようにリソースがロードされるたびに呼び出されます。

2.ユーザーがWebView内からリソースをインタラクティブにリクエストする場合、shouldOverrideUrlLoadingクラスのWebViewClientメソッドを使用してリクエストをインターセプトできます。以下にコード例を示します。 出所

 private class MyWebViewClient extends WebViewClient {
     @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.google.com")) {
            return true;
        }
        return false;
    }
 }

このメソッドは、新しいURLが現在のWebViewにロードされようとしているときに、ホストアプリケーションにコントロールを引き継ぐ機会を与えます。戻り値trueは、ホストアプリケーションがURLを処理することを意味し、falseを返すことは、現在のWebViewがURLを処理することを意味します。上記のコードは、ホスト「www.google.com」からリソースがロードされるのを防ぎます。

ただし、このメソッドは、たとえばHTMLタグまたはSCRIPTタグ内のIFRAME属性やsrc属性など、内部からのリソースの読み込みをインターセプトしません。さらに、XmlHttpRequestsもインターセプトされません。これらのリクエストをインターセプトするために、WebViewClient shouldInterceptRequestメソッドを利用できます。以下にコード例を示します。

@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
    if (url.contains(".js")) {
        return getWebResourceResponseFromString();
    } else {
        return super.shouldInterceptRequest(view, url);
    }
}
private WebResourceResponse getWebResourceResponseFromString() {
    return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')"));
}
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) {
    return new WebResourceResponse("text/javascript", "UTF-8", data);
}

このメソッドは、ホストアプリケーションにリソース要求を通知し、アプリケーションがデータを返すことを許可します。戻り値がnullの場合、WebViewは通常どおりリソースをロードし続けます。それ以外の場合、戻り応答とデータが使用されます。上記のコードは、JavaScriptリソース(.js)のリクエストをインターセプトし、リクエストされたリソースの代わりにアラートを返します。

WebViewClientで詳細を参照してください shouldOverrideUrlLoading および shouldInterceptRequest

31
Giru Bhai

ShouldOverrideUrlLoadingは、新しいページがWebビューに読み込まれるときに呼び出されると考えています。たとえば、最初の操作を行うときなどです。

webview.loadUrl( "file:///Android_asset/web/index.html" );      

ShouldOverrideUrlLoadingが呼び出されます。ユーザーがリンクをクリックして新しいページを参照すると、再度呼び出されます。

shouldInterceptRequestは、現在のページ内で行われたすべてのリクエストに対して呼び出される必要があります。フォントをHTMLインポートするとshouldInterceptRequestが呼び出されるか、webViewがページに画像を読み込もうとすると呼び出されます(ただし、ajaxリクエストの呼び出しが表示されないので、まだ少し混乱しています)。

2
Tom