什么是Android WebViewClient中的onPageFinished?

时间:2012-11-20 02:28:03

标签: android webview webviewclient

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

Google文档说明了这一点:

public void onPageFinished (WebView view, String url)

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

  

参数

     

查看正在启动回调的WebView。

     

url页面的网址。

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

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

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

3 个答案:

答案 0 :(得分:7)

您需要从WebChromeClient实现回调。 onPageFinished()是由WebViewClient提供的API。还有另一个名为WebChromeClient的接口,它提供了您正在寻找的进度信息:

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

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

当页面上的JS完成时,我不知道你的意思。也许你可以澄清你的意思?

答案 1 :(得分: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并不是你所期待的。

答案 2 :(得分:0)

要回答您的第一个问题:我发现onProgressChanged无法到达100,并且在所有资产(css / js / images)都有onPageFinished之后才会调用{{1}}已完成该页面的加载。

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