2014-10-30 6 views
21

Bitte teilen Sie mir den Unterschied zwischen den Methoden public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) und public boolean shouldOverrideUrlLoading(WebView view, String url).Unterschied zwischen shoveroverrideurloading und shouldinterceprequest?

Ich erstelle eine Android-Anwendung, in der eine Zeichenfolge als die Antwort eines Klickereignisses in meinem WebView erhalten wird. Ich möchte diese Zeichenfolge speichern und anzeigen.Ich habe diese beiden Methoden gesehen.Ich habe versucht, shouldOverrideUrlLoading zu verwenden gibt die Weiterleitungs-URL zurück, wenn ich beim Erstellen einer Beispiel-App mit google.com als URL, die ich in meine WebView geladen habe, angeklickt und auf ein Menü geklickt habe.

Könnte mir bitte jemand den Unterschied zwischen beiden Methoden sagen und welchen sollte ich verwenden?

Antwort

1

Ich glaube, dass shouldOverrideUrlLoading aufgerufen wird, wenn eine neue Seite in die Webansicht geladen, so zum Beispiel, wenn Sie tun, um Ihre anfängliche:

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

YOur shouldOverrideUrlLoading wird aufgerufen werden, und es wird wieder bekommen aufgerufen wenn der Benutzer auf einen Link klickt, um zu einer neuen Seite zu navigieren.

sentInterceptRequest sollte für alle Anfragen innerhalb der aktuellen Seite aufgerufen werden, z. Wenn ich HTML-Schriften importiere, sehe ich, dass sentInterceptRequest aufgerufen wird, oder wenn das WebView versucht, Bilder auf meine Seite zu laden, wird es aufgerufen (aber ich sehe es nicht für Ajax-Anfragen an, bin also immer noch etwas verwirrt).

+0

Offenbar shouldOverrideUrlLoading() nicht aufgerufen werden, wenn die loadURL zum ersten genannt wird. Entgegen der landläufigen Meinung wird shouldOverrideUrlLoading() aufgerufen, wenn von der bereits geladenen Webseite auf einen internen Link geklickt wird. – AnupamChugh

23

Die Android WebKit Implementierung ermöglicht es dem Entwickler eine WebView durch die android.webkit.WebSettings Klasse wie

  • Unterstützung für JavaScript zu ändern,
  • Unterstützung für Plugins,
  • Dateisystemzugriff,
  • Ressourcen Inspection etc.

In Ressourceninspektion, es ist möglich, die Anforderungen für Inhalt und/oder Ressourcen durch Überschreiben shouldOverrideUrlLoading und sophInterceptRequest Methoden zu überprüfen.

Aber vor zwei Methoden sind die Verwendung für verschiedene Zwecke wie

1. shouldOverrideUrlLoading aufgerufen wird, wenn eine neue Seite im Begriff ist, während shouldInterceptRequest geöffnet werden soll, wird jedes Mal, wenn eine Ressource wie eine CSS-Datei geladen wird aufgerufen, ein js Datei usw.

2.Wenn ein Benutzer interaktiv eine Ressource von einem WebView anfordert, ist es möglich, durch die Verwendung der shouldOverrideUrlLoading-Methode der Klasse WebViewClient die Anfrage abzufangen. Beispielcode ist unten dargestellt. 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; 
    } 
} 

Das Verfahren gibt der Host-Anwendung eine Chance, die Kontrolle zu übernehmen, wenn eine neue URL über im aktuellen WebView geladen werden. Ein Rückgabewert von true bedeutet, dass die Host-Anwendung die URL behandelt, während return false bedeutet, dass das aktuelle WebView die URL behandelt. Der obige Code verhindert, dass Ressourcen vom Host "www.google.com" geladen werden.

Die Methode fängt jedoch das Laden von Ressourcen nicht von innen ab, z. B. von einem IFRAME- oder src-Attribut innerhalb eines HTML- oder SCRIPT-Tags. Außerdem würden XmlHttpRequests auch nicht abgefangen. Um diese Anfragen abzufangen, können Sie die Methode WebViewClient shouldInterceptRequest verwenden. Beispielcode ist unten dargestellt.

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

Das Verfahren teilt die Host-Anwendung von einer Ressourcen-Anforderung und erlaubt die Anwendung die Daten zurückzukehren. Wenn der Rückgabewert null ist, lädt das WebView die Ressource weiterhin wie gewohnt. Andernfalls werden die Antwortantwort und die Daten verwendet. Der obige Code fängt Anfragen nach JavaScript-Ressourcen (.js) ab und gibt eine Warnung anstelle der angeforderten Ressource zurück.

Mehr unter: WebViewClient shouldOverrideUrlLoading und shouldInterceptRequest