2014-10-30 4 views
21

Кто-нибудь, пожалуйста, скажите мне разницу между методами public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) и public boolean shouldOverrideUrlLoading(WebView view, String url).Разница между перегрузкой и перегрузкой?

Я создаю приложение для Android, в котором строка получена как ответ события click в моем WebView. Я хочу сохранить эту строку и отобразить ее. Я видел оба этих метода. Я попытался использовать shouldOverrideUrlLoading, который возвращает URL-адрес перенаправления, когда я проверил, создав пример приложения, используя google.com в качестве URL-адреса, который я загрузил в свой WebView, и нажал на меню.

Может ли кто-нибудь сказать мне разницу между обоими методами и какой из них я должен использовать?

ответ

1

Я считаю, что shouldOverrideUrlLoading вызывается, когда новая страница загружается в WebView, так, например, когда вы делаете ваш первоначальный:

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

Ваш shouldOverrideUrlLoading получит вызывается, и он получит снова вызывалась если пользователь нажимает на ссылку для перехода на новую страницу.

mustInterceptRequest должен быть вызван для всех запросов, сделанных на текущей странице, например. когда я импортирую HTML-шрифты, я вижу, что invInterceptRequest получает вызов, или когда webView пытается загрузить изображения на мою страницу, он вызывается (но я не вижу, чтобы он вызывал запросы ajax, поэтому я все еще немного запутался).

+0

По-видимому, shouldOverrideUrlLoading() не будет вызвана, когда loadUrl вызывается для первого. Вопреки распространенному мнению, shouldOverrideUrlLoading() вызывается при нажатии любой внутренней ссылки с уже загруженной веб-страницы. – AnupamChugh

23

Реализация Android WebKit позволяет разработчику изменять WebView через android.webkit.WebSettings класса, такие как

  • поддержка JavaScript,
  • Поддержка плагинов,
  • System File Access,
  • Inspection ресурсов и т.д.

В Проверка ресурсов, можно проверить запросы на контент и/или ресурсы путем переопределения shouldOverrideUrlLoading и shouldInterceptRequest методов.

Но выше двух методов использовать для различных целей, таких как

shouldOverrideUrlLoading 1. вызывается, когда новая страница собирается быть открыта в то время как shouldInterceptRequest называется каждый раз, когда ресурс загружается как файл CSS, JS файл и т. д.

2.Если пользователь интерактивно запрашивает ресурс из WebView, это возможно с помощью метода shouldOverrideUrlLoading класса WebViewClient для перехвата запроса. Пример кода представлен ниже. 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-адрес, а return false означает, что текущий WebView обрабатывает URL-адрес. Приведенный выше код не позволяет загружать ресурсы с хоста «www.google.com».

Однако метод не перехватывает загрузку ресурсов изнутри, например, из атрибута IFRAME или src в теге HTML или SCRIPT. Кроме того, 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

Смежные вопросы