shouldoverrideurlloading和shouldinterceptrequest之间的区别?

时间:2014-10-30 11:18:25

标签: android webview webclient intercept

任何人都请告诉我方法public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)public boolean shouldOverrideUrlLoading(WebView view, String url)之间的区别。

我正在创建一个Android应用程序,其中获取一个字符串作为我WebView中点击事件的响应。我想存储此字符串并显示它。我看到了这两种方法。我试过使用shouldOverrideUrlLoading返回重定向网址,当我选中创建示例应用时,使用google.com作为我在WebView中加载的网址,然后点击菜单。

有谁能告诉我两种方法之间的区别以及我应该使用哪种方法?

2 个答案:

答案 0 :(得分:31)

Android WebKit实现允许开发人员通过WebView类修改android.webkit.WebSettings,例如

  • 支持JavaScript,
  • 支持插件,
  • 文件系统访问,
  • 资源检查等。

资源检查中,可以通过覆盖 shouldOverrideUrlLoading shouldInterceptRequest 方法来检查内容和/或资源请求。

但以上两种方法可用于不同目的,例如

1。当要打开新页面时调用shouldOverrideUrlLoading,而每次加载资源时调用shouldInterceptRequest,如css文件,js文件等。

2.如果用户以交互方式从WebView中请求资源,则可以通过使用shouldOverrideUrlLoading类的WebViewClient方法来拦截请求。示例代码如下所示。 Source

 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;
    }
 }

该方法使主机应用程序有机会在当前WebView中加载新URL时接管控件。返回值为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 shouldOverrideUrlLoadingshouldInterceptRequest

答案 1 :(得分:2)

我相信在将新页面加载到webview中时会调用shouldOverrideUrlLoading,例如,当你执行初始化时:

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

如果用户点击链接浏览新页面,将调用ifOverrideUrlLoading,并再次调用它。

应该为当前页面内发出的所有请求调用shouldInterceptRequest,例如。当我导入HTML格式时,我看到调用了shouldInterceptRequest,或者当webView尝试在我的页面上加载图像时,它被调用(但是我没有看到它调用了ajax请求,所以我仍然有点困惑)。