Подтвердить что ты не робот

Разница между перегрузкой и перегрузкой?

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

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

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

4b9b3361

Ответ 1

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

  • Поддержка JavaScript,
  • Поддержка плагинов,
  • Доступ к файловой системе,
  • Проверка ресурсов и т.д.

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

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

1. shouldOverrideUrlLoading вызывается при открытии новой страницы, тогда как shouldInterceptRequest вызывается каждый раз, когда ресурс загружается как файл css, js файл и т.д.

2. Если пользователь интерактивно запрашивает ресурс из WebView, это возможно с помощью метода shouldOverrideUrlLoading класса WebViewClient для перехвата запроса. Пример кода представлен ниже. Источник

 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

Ответ 2

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

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

YOUR shouldOverrideUrlLoading будет вызван, и он будет снова вызван, если пользователь нажмет на ссылку, чтобы перейти на новую страницу.

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