我正在尝试在我的网页加载完成后在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上。
答案 0 :(得分:7)
您需要从WebChromeClient实现回调。 onPageFinished()是由WebViewClient提供的API。还有另一个名为WebChromeClient的接口,它提供了您正在寻找的进度信息:
打开上面的链接并查找onProgressChanged(WebView视图,int newProgress) - 'newProgress'变量为您提供已完成的页面加载百分比。当它达到100时,你有一个有效的页面。 onPageFinished()无法可靠地用于此(由于服务器端重定向等)
当页面上的JS完成时,我不知道你的意思。也许你可以澄清你的意思?
答案 1 :(得分:2)
自:
@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}}已完成该页面的加载。