shouldoverrideurlloading和shouldinterceptrequest之间的区别?

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

我正在创build一个android应用程序,其中一个string作为我的WebView中的点击事件的响应。我想要存储这个string并显示它。我看到了这两个方法。我试着使用shouldOverrideUrlLoading ,它返回redirecturl当我检查与创build一个示例应用程序使用google.com作为我在我的WebView加载的url,并单击菜单。

任何人都可以告诉我两种方法之间的区别,我应该使用哪一个?

Solutions Collecting From Web of "shouldoverrideurlloading和shouldinterceptrequest之间的区别?"

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

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

资源检查中 ,可以通过重写shouldOverrideUrlLoadingshouldInterceptRequest方法来检查对内容和/或资源的请求。

但是以上两种方法都是用于不同目的的

1. shouldOverrideUrlLoading被调用,当一个新的页面将被打开,而shouldInterceptRequest被调用每次资源被加载,如一个CSS文件,一个JS文件等

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

  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中时,该方法为主机应用程序提供接pipe控制权的机会。 返回值为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

试着理解这种方式,希望这会帮助你解决你的问题。

公共WebResourceResponse shouldInterceptRequest(WebView视图,String url)

 Added in API level 11 This method was deprecated in API level 21. Use shouldInterceptRequest(WebView, WebResourceRequest) instead. Notify the host application of a resource request and allow the application to return the data. If the return value is null, the WebView will continue to load the resource as usual. Otherwise, the return response and data will be used. NOTE: This method is called on a thread other than the UI thread so clients should exercise caution when accessing private data or the view system. Parameters view The WebView that is requesting the resource. url The raw url of the resource. Returns A WebResourceResponse containing the response information or null if the WebView should load the resource itself. 

public boolean shouldOverrideUrlLoading(WebView视图,String url)

 Added in API level 1 Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. This method is not called for requests using the POST "method". Parameters view The WebView that is initiating the callback. url The url to be loaded. Returns True if the host application wants to leave the current WebView and handle the url itself, otherwise return false. 

参考: http : //developer.android.com/reference/android/webkit/WebViewClient.html

我相信,当一个新的页面被加载到web视图时,应调用UrlUrlLoading,例如,当你做你的初始:

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

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

shouldInterceptRequest应该为当前页面内的所有请求调用,例如。 当我的HTML导入字体,我看到shouldInterceptRequest被调用,或者当webView试图加载我的网页上的图像它被调用(但我没有看到它调用Ajax请求,所以我还是有点困惑)。