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

Что считается onPageFinished в Android WebViewClient?

Я пытаюсь выполнить действие в Android WebView после того, как моя веб-страница завершает загрузку. Я настраиваю свой WebView на использование WebViewClient для использования обратного вызова события onPageFinished. Однако после некоторого тестирования он, кажется, не дожидается до тех пор, пока все JS на странице не будут загружены до того, как начнется мой код onPageFinished.

В документации Google сказано следующее:

public void onPageFinished (WebView view, String url)

Добавлен в API уровня 1 Уведомлять хост-приложение, что страница закончила загрузку. Этот метод вызывается только для основного кадра. Когда вызывается onPageFinished(), изображение рендеринга может еще не обновляться. Чтобы получить уведомление для нового изображения, используйте onNewPicture (WebView, изображение).

Параметры

view WebView, который инициирует обратный вызов.

url URL страницы.

1) Does onPageFinished только ждать загрузки DOM?

2) Есть ли способ обнаружить, когда какой-либо JS на странице заканчивается? Если да, то что я должен использовать?

Я не вижу ничего в WebViewClient, который был бы для этой цели. Я не хочу добавлять задержку, так как мои пользователи могут быть на EDGE или на LTE.

4b9b3361

Ответ 1

Вам нужно реализовать обратные вызовы из WebChromeClient. OnPageFinished() - это API, предоставляемый WebViewClient. Существует еще один интерфейс с именем WebChromeClient, который предоставляет информацию о ходе работы, которую вы ищете:

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView, int)

Откройте ссылку выше и найдите onProgressChanged (представление WebView, int newProgress) - переменная 'newProgress' дает процент загрузки страницы, который был завершен. Когда он достигнет 100, у вас есть действительная страница. onPageFinished() не может быть надежно использован для этого (из-за перенаправления на стороне сервера и т.д.)

Я не знаю, что вы подразумеваете под "когда JS на странице закончен". Может быть, вы можете уточнить, что вы имели в виду?

Ответ 2

From:

https://chromium.googlesource.com/chromium/src.git/+/master/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java

    @Override
    public void didFinishNavigation(final String url, boolean isInMainFrame, boolean isErrorPage,
            boolean hasCommitted, boolean isSameDocument, boolean isFragmentNavigation,
            Integer pageTransition, int errorCode, String errorDescription, int httpStatusCode) {
        ...
        if (client != null && isFragmentNavigation) {
            client.getCallbackHelper().postOnPageFinished(url);
        }
    }

    @Override
    public void didFailLoad(
            boolean isMainFrame, int errorCode, String description, String failingUrl) {
        AwContentsClient client = mAwContentsClient.get();
        if (client == null) return;
        String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl();
        boolean isErrorUrl =
                unreachableWebDataUrl != null && unreachableWebDataUrl.equals(failingUrl);
        if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED) {
            // Need to call onPageFinished for backwards compatibility with the classic webview.
            // See also AwContents.IoThreadClientImpl.onReceivedError.
            client.getCallbackHelper().postOnPageFinished(failingUrl);
        }
    }

    @Override
    public void didStopLoading(String validatedUrl) {
        if (validatedUrl.length() == 0) validatedUrl = ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL;
            AwContentsClient client = getClientIfNeedToFireCallback(validatedUrl);
        if (client != null && validatedUrl.equals(mLastDidFinishLoadUrl)) {
            client.getCallbackHelper().postOnPageFinished(validatedUrl);
        mLastDidFinishLoadUrl = null;
        }
    }

Мы можем легко видеть, что onPageFinished - это не то, что вы ожидаете.

Ответ 3

Чтобы ответить на ваш первый вопрос: я обнаружил, что onProgressChanged не достигнет 100, а onPageFinished не будет вызываться, пока все активы (css/js/images) не закончили загрузку для этой страницы.

Я не могу, однако, найти официальную документацию, в которой говорится, что.