2014-10-30 26 views
21

Chiunque mi dica la differenza tra i metodi public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) e public boolean shouldOverrideUrlLoading(WebView view, String url).Differenza tra il carico di lavoro necessario e quello necessario per l'intercettazione?

Sto creando un'applicazione Android in cui è presente una stringa come risposta di un evento click nel mio WebView .Voglio memorizzare questa stringa e visualizzarla.Ho visto entrambi questi metodi. Ho provato a utilizzare shouldOverrideUrlLoading restituisce l'url di reindirizzamento quando ho controllato con la creazione di un'app di esempio utilizzando google.com come l'URL che ho caricato nel mio WebView e ho fatto clic su un menu.

Qualcuno potrebbe dirmi la differenza tra entrambi i metodi e quale dovrei usare?

risposta

1

credo che shouldOverrideUrlLoading viene richiamato quando una nuova pagina viene caricata nella WebView, quindi, ad esempio, quando fate la vostra iniziale:

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

il tuo shouldOverrideUrlLoading otterrà invocato, e otterrà di nuovo invocato se l'utente fa clic su un link per cercare una nuova pagina.

shouldInterceptRequest deve essere richiamato per tutte le richieste effettuate all'interno della pagina corrente, ad es. quando I font di importazione HTML vedo shouldInterceptRequest che viene chiamato, o quando la webView tenta di caricare le immagini sulla mia pagina viene chiamato (ma non vedo che richieda richieste Ajax, quindi sono ancora un po 'confuso).

+0

A quanto pare, shouldOverrideUrlLoading() non viene chiamato quando la loadURL viene chiamato per la prima. Contrariamente alla credenza popolare, shouldOverrideUrlLoading() viene chiamato quando viene fatto clic su qualsiasi collegamento interno dalla pagina Web già caricata. – AnupamChugh

23

L'implementazione WebKit Android consente allo sviluppatore di modificare un WebView attraverso la classe android.webkit.WebSettings come

  • Supporto per JavaScript,
  • Supporto per plugin,
  • File System Access,
  • ispezione delle risorse ecc.

Ispezione risorse, è possibile esaminare le richieste di contenuto e/o risorse ignorando i metodi shouldOverrideUrlLoading e shouldInterceptRequest.

Ma soprattutto due metodi sono l'uso per scopi diversi, come

1. shouldOverrideUrlLoading viene chiamato quando una nuova pagina sta per essere aperto, mentre shouldInterceptRequest viene chiamato ogni volta che una risorsa viene caricato come un file CSS, un js file ecc.

2.Se un utente richiede una risorsa in modo interattivo all'interno di una WebView, è possibile utilizzare il metodo shouldOverrideUrlLoading della classe WebViewClient per intercettare la richiesta. Il codice di esempio è presentato di seguito. 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; 
    } 
} 

il metodo permette l'applicazione host la possibilità di prendere il controllo quando un nuovo URL sta per essere caricata nella WebView corrente. Un valore restituito di true indica che l'applicazione host gestisce l'URL, mentre return false indica che l'attuale WebView gestisce l'URL. Il codice sopra impedisce che le risorse vengano caricate dall'host "www.google.com".

Tuttavia, il metodo non intercetta il caricamento delle risorse dall'interno, ad esempio da un attributo IFRAME o src all'interno di un tag HTML o SCRIPT, ad esempio. Inoltre XmlHttpRequests non verrebbe nemmeno intercettato. Per intercettare queste richieste è possibile utilizzare il metodo WebViewClient shouldInterceptRequest. Il codice di esempio è presentato di seguito.

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

Il metodo notifica l'applicazione host di una richiesta di risorsa e consente all'applicazione di restituire i dati. Se il valore restituito è nullo, WebView continuerà a caricare la risorsa come al solito. In caso contrario, verranno utilizzati la risposta di ritorno e i dati. Il codice sopra intercetta richieste di risorse JavaScript (js) e restituisce un avviso al posto della risorsa richiesta.

saperne di più visita: WebViewClient shouldOverrideUrlLoading e shouldInterceptRequest