任何人都请告诉我方法public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
和public boolean shouldOverrideUrlLoading(WebView view, String url)
之间的区别。
我正在创建一个Android应用程序,其中获取一个字符串作为我WebView
中点击事件的响应。我想存储此字符串并显示它。我看到了这两种方法。我试过使用shouldOverrideUrlLoading
返回重定向网址,当我选中创建示例应用时,使用google.com作为我在WebView
中加载的网址,然后点击菜单。
有谁能告诉我两种方法之间的区别以及我应该使用哪种方法?
答案 0 :(得分:31)
Android WebKit实现允许开发人员通过WebView类修改android.webkit.WebSettings,例如
在资源检查中,可以通过覆盖 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 shouldOverrideUrlLoading和shouldInterceptRequest
答案 1 :(得分:2)
我相信在将新页面加载到webview中时会调用shouldOverrideUrlLoading,例如,当你执行初始化时:
webview.loadUrl( "file:///android_asset/web/index.html" );
如果用户点击链接浏览新页面,将调用ifOverrideUrlLoading,并再次调用它。
应该为当前页面内发出的所有请求调用shouldInterceptRequest,例如。当我导入HTML格式时,我看到调用了shouldInterceptRequest,或者当webView尝试在我的页面上加载图像时,它被调用(但是我没有看到它调用了ajax请求,所以我仍然有点困惑)。