【问题标题】:What is considered onPageFinished in the Android WebViewClient?Android WebViewClient 中的 onPageFinished 被认为是什么?
【发布时间】:2012-11-08 01:54:01
【问题描述】:

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

Google 文档是这样说的:

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。

【问题讨论】:

    标签: android webview webviewclient


    【解决方案1】:

    您需要实现来自 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 完成时”是什么意思。或许你能澄清一下你的意思?

    【讨论】:

    • 我正在尝试确定与页面关联的 Javascript 何时完成运行。从我的工作中,我看到 onPageFinished 在页面的 HTML 部分完成加载时被调用 - 不一定是在 Javascript 完成时。您指向的方法没有给我我需要的答案,即“有没有办法检测页面上的任何 [Javascript] 何时完成?如果是,我应该使用什么?”
    • 当您说“页面上的 JS 完成”时,您的意图是什么?您的意思是“当它完成执行时”。如果这就是您的意思,那么您可能想要 a.) 通过使用 addJavascriptInterface() 方法(WebViewClient 类的成员)在 HTML 代码(web)和 Java 代码(android)之间创建一个 JavaScript 接口,或者 b.)添加一些自定义日志或警报到 JS 函数中,并使用属于 WebChromeClient 类的 onConsoleMessage()/onJsAlert() 方法检测它。
    【解决方案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 并不是您所期望的。

    【讨论】:

      【解决方案3】:

      回答您的第一个问题:我发现onProgressChanged 不会到达100,并且在该页面的所有资产(css/js/images)完成加载之前不会调用onPageFinished

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多