18

在我的网页完成加载后,我正在尝试对 Android WebView 执行操作。我将 WebView 设置为具有 WebViewClient 以使用 onPageFinished 事件回调。但是,经过一些测试,似乎并没有等到页面上的所有 JS 都完成加载后,我的 onPageFinished 代码才会触发。

谷歌文档是这样说的:

public void onPageFinished (WebView view, String url)

在 API 级别 1 中添加 通知主机应用程序页面已完成加载。此方法仅对主机调用。调用 onPageFinished() 时,渲染图片可能还没有更新。要获取新图片的通知,请使用 onNewPicture(WebView, Picture)。

参数

view 正在启动回调的 WebView。

url 页面的 url。

1) onPageFinished 是否只等待 DOM 加载?

2)有没有办法检测页面上的任何JS何时完成?如果是这样,我应该使用什么?

我在 WebViewClient 中看不到任何用于此目的的内容。我不想增加延迟,因为我的用户可以使用 EDGE 或 LTE。

4

3 回答 3

7

您需要实现来自 WebChromeClient 的回调。onPageFinished() 是 WebViewClient 提供的 API。还有另一个名为 WebChromeClient 的界面提供您正在寻找的进度信息:

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

打开上面的链接并查找 onProgressChanged(WebView view, int newProgress) - 'newProgress' 变量为您提供已完成页面加载的百分比。当它达到 100 时,您就有了一个有效的页面。onPageFinished() 不能可靠地用于此(由于服务器端重定向等)

我不知道您所说的“页面上的 JS 完成时”是什么意思。也许你可以澄清你的意思?

于 2013-01-30T18:47:54.883 回答
2

从:

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 并不是您所期望的。

于 2017-09-20T07:48:44.120 回答
0

要回答您的第一个问题:我发现在所有资产(css/js/images)完成加载该页面之前不会调用它onProgressChanged100onPageFinished

但是,我找不到任何说明这一点的官方文件。

于 2014-09-08T01:52:08.780 回答