2014-10-30 51 views
21

任何人都可以告訴我方法public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)public boolean shouldOverrideUrlLoading(WebView view, String url)之間的區別。shouldoverrideurlloading和shouldinterceptrequest之間的區別?

我創建將字符串被作爲了一個click事件在我WebView。我響應一個Android應用程序要保存這個字符串,並顯示它。我看到這兩個methods.I的嘗試使用shouldOverrideUrlLoading這返回重定向網址時,我檢查與創建一個示例應用程序使用google.com作爲我加載在我的WebView並點擊菜單的網址。

任何人都可以告訴我兩種方法之間的區別,我應該使用哪一種?

回答

1

我相信,當一個新的頁面被加載到web視圖shouldOverrideUrlLoading被調用,因此,例如,當你做你的初始:

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

您shouldOverrideUrlLoading將被調用,並且它會被再次調用如果用戶點擊鏈接瀏覽到新頁面。

shouldInterceptRequest應該爲當前頁面內的所有請求調用,例如。當我導入HTML字體時,我看到了shouldInterceptRequest被調用,或者當webView嘗試在我的頁面上加載圖像時,它會被調用(但我沒有看到它調用了Ajax請求,所以我仍然有點困惑)。

+0

顯然,shouldOverrideUrlLoading()不獲取時使用loadURL被稱爲第一個調用。與流行的觀點相反,當從已經加載的網頁中點擊任何內部鏈接時,shouldOverrideUrlLoading()被調用。 – AnupamChugh 2017-09-18 12:30:02

23

Android的WebKit的執行允許開發者通過android.webkit.WebSettings類修改WebView

  • 支持JavaScript的,
  • 支持插件,
  • 文件系統訪問,
  • 資源檢查等等

資源檢查,可以通過覆蓋shouldOverrideUrlLoadingshouldInterceptRequest方法來檢查內容和/或資源的請求。

但以上兩種方法都使用了不同的目的,如

1. shouldOverrideUrlLoading當一個新的一頁即將被打開,而每shouldInterceptRequest資源加載像一個CSS文件時間被稱爲被調用時,一個js文件等。

2.如果用戶在WebView中交互式地請求資源,則可以通過使用WebViewClient類的shouldOverrideUrlLoading方法來攔截請求。代碼示例如下。 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; 
    } 
} 

的方法使主機應用程序的機會,當一個新的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); 
} 

該方法通知主機應用程序的資源請求,並允許應用程序返回數據。如果返回值爲空,則WebView將像往常一樣繼續加載資源。否則,將使用返回響應和數據。上面的代碼攔截對JavaScript資源(.js)的請求,並返回警報而不是請求的資源。

多見於:WebViewClient shouldOverrideUrlLoadingshouldInterceptRequest