web-dev-qa-db-fra.com

Quelle est la différence entre le deverreur et le rechargement de l'interception?

Je vous prie de me dire la différence entre les méthodes public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) et public boolean shouldOverrideUrlLoading(WebView view, String url).

Je crée une Android dans laquelle une chaîne est obtenue comme réponse d'un événement de clic dans mon WebView. Je veux stocker cette chaîne et l'afficher. J'ai vu ces deux méthodes. J'ai essayé d'utiliser shouldOverrideUrlLoading qui renvoie l'URL de redirection lorsque j'ai vérifié en créant un exemple d'application en utilisant google.com comme URL que j'ai chargée dans mon WebView et en cliquant sur un menu.

Quelqu'un pourrait-il me dire la différence entre les deux méthodes et laquelle dois-je utiliser?

27
Nevaeh

La mise en œuvre Android WebKit permet au développeur de modifier une classe WebView via la classe Android.webkit.WebSettings telle que

  • Prise en charge de JavaScript,
  • Prise en charge des plugins,
  • Accès au système de fichiers,
  • Inspection des ressources, etc.

Dans Inspection des ressources , il est possible d'inspecter les demandes de contenu et/ou de ressources en remplaçant shouldOverrideUrlLoading et les méthodes shouldInterceptRequest .

Mais au-dessus de deux méthodes sont utilisées à des fins différentes telles que

1 .shouldOverrideUrlLoading est appelée lorsqu'une nouvelle page est sur le point d'être ouverte tandis que shouldInterceptRequest est appelée à chaque fois qu'une ressource est chargée comme un fichier css, un fichier js etc.

2.Si un utilisateur demande interactivement une ressource à partir d'une WebView, il est possible d'utiliser la méthode shouldOverrideUrlLoading de la classe WebViewClient pour intercepter la demande. Un exemple de code est présenté ci-dessous. 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;
    }
 }

La méthode donne à l'application hôte une chance de prendre le contrôle lorsqu'une nouvelle URL est sur le point d'être chargée dans la WebView actuelle. Une valeur de retour true signifie que l'application hôte gère l'URL, tandis que return false signifie que le WebView actuel gère l'URL. Le code ci-dessus empêche le chargement des ressources depuis l'hôte "www.google.com".

Cependant, la méthode n'intercepte pas le chargement des ressources de l'intérieur, comme à partir d'un attribut IFRAME ou src dans une balise HTML ou SCRIPT par exemple. De plus, XmlHttpRequests ne serait pas non plus intercepté. Pour intercepter ces requêtes, vous pouvez utiliser la méthode WebViewClient shouldInterceptRequest. Un exemple de code est présenté ci-dessous.

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

La méthode notifie à l'application hôte une demande de ressource et permet à l'application de renvoyer les données. Si la valeur de retour est nulle, WebView continuera de charger la ressource comme d'habitude. Sinon, la réponse de retour et les données seront utilisées. Le code ci-dessus intercepte les demandes de ressources JavaScript (.js) et renvoie une alerte à la place de la ressource demandée.

Voir plus sur: WebViewClient shouldOverrideUrlLoading et shouldInterceptRequest

31
Giru Bhai

Je pense que shouldOverrideUrlLoading est invoqué lorsqu'une nouvelle page est chargée dans la vue Web, par exemple, lorsque vous effectuez votre initial:

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

YOur shouldOverrideUrlLoading sera invoqué, et il sera invoqué à nouveau si l'utilisateur clique sur un lien pour naviguer vers une nouvelle page.

shouldInterceptRequest devrait être appelé pour toutes les demandes faites dans la page actuelle, par exemple. lorsque j'importe des polices HTML, je vois que shouldInterceptRequest est appelé, ou lorsque le WebView essaie de charger des images sur ma page, il est appelé (mais je ne le vois pas appelé pour les demandes ajax, donc je suis toujours un peu confus).

2
Tom