首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android WebViewClient中,什么是onPageFinished?

在Android WebViewClient中,什么是onPageFinished?
EN

Stack Overflow用户
提问于 2012-11-20 10:28:03
回答 3查看 10.6K关注 0票数 17

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

Google文档是这样说的:

代码语言:javascript
复制
public void onPageFinished (WebView view, String url)

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

参数

查看发起回调的WebView。

url页面的url。

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

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

我在WebViewClient中看不到任何用于此目的的东西。我不想增加延迟,因为我的用户可能在边缘或在LTE上。

EN

回答 3

Stack Overflow用户

发布于 2013-01-31 02:47:55

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

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2017-09-20 15:48:44

发自:

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

代码语言:javascript
复制
    @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
EN

Stack Overflow用户

发布于 2014-09-08 09:52:09

回答您的第一个问题:我发现onProgressChanged无法访问100,并且直到该页面的所有资源(css/js/ onPageFinished )加载完毕后才会调用onPageFinished

然而,我找不到任何官方文件来说明这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13465732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档