在网页加载完成后,我正尝试在Android WebView上执行操作。我将我的WebView设置为使用WebViewClient来使用onPageFinished事件回调。然而,经过一些测试之后,似乎并不需要等到页面上的所有JS都加载完成后,才会触发我的onPageFinished代码。
Google文档是这样说的:
public void onPageFinished (WebView view, String url)
添加在API级别1中,通知宿主应用程序页面已完成加载。此方法仅对主框架调用。当调用onPageFinished()时,渲染图片可能还没有更新。若要获取新图片的通知,请使用onNewPicture(WebView,Picture)。
参数
查看发起回调的WebView。
url页面的url。
1) onPageFinished是否只等待DOM加载?
2)有没有办法检测页面上的JS何时结束?如果是这样,我应该使用什么?
我在WebViewClient中看不到任何用于此目的的东西。我不想增加延迟,因为我的用户可能在边缘或在LTE上。
发布于 2013-01-31 02:47:55
您需要实现来自WebChromeClient的回调。onPageFinished()是一个由WebViewClient提供的接口。还有另一个名为WebChromeClient的接口,它提供您正在寻找的进度信息:
打开上面的链接并查找onProgressChanged(WebView视图,int newProgress) - 'newProgress‘变量给出了页面加载完成的百分比。当它达到100时,你就有了一个有效的页面。onPageFinished()不能可靠地用于此(由于服务器端重定向等原因)
我不知道你说的“页面上的JS何时完成”是什么意思。也许你可以澄清一下你的意思?
发布于 2017-09-20 15:48:44
发自:
@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并不是您所期望的那样。
发布于 2014-09-08 09:52:09
回答您的第一个问题:我发现onProgressChanged
无法访问100
,并且直到该页面的所有资源(css/js/ onPageFinished
)加载完毕后才会调用onPageFinished
。
然而,我找不到任何官方文件来说明这一点。
https://stackoverflow.com/questions/13465732
复制相似问题