我如何知道我的 WebView 已加载 100%?
我正在尝试在 WebView 中加载一些包含 JavaScript 的 HTML 代码。
现在,我想测试我的 WebView 是否在 5 秒之前加载。我尝试过 getProgress()
方法,但有时我得到进度为 100,但我的 Webview 未加载。
有没有其他方法可以确保我的 Webview 加载 100%?
这是我的代码的一部分:
sdk.getWebView().loadDataWithBaseURL("notreal/", data_html,MIME_TYPE,ENCODING_UTF_8,null);
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run(){
Log.i("TAG", "progress fin = "+sdk.getWebView().getProgress());
if(sdk.getWebView().getProgress() <100){
//cancel the webView
sdk.getContext().runOnUiThread(new Runnable() {
@Override
public void run() {
sdk.getImgView().setVisibility(View.VISIBLE);
sdk.getWebView().setVisibility(View.GONE);
}
});
}
// else ,the Webview is loaded
else{
//prepare webview
sdk.getContext().runOnUiThread(new Runnable() {
@Override
public void run(){
// hide imageView
sdk.getImgView().setVisibility(View.GONE);
sdk.getWebView().setVisibility(View.VISIBLE);
}
});
}
}
};
timer.schedule(task, 5000);
I'm trying to load in my WebView some HTML code that contains JavaScript.
Now , I want to test if my WebView is loaded before 5 secondes. I've tried the method getProgress()
, but sometimes I get that the progress is 100, but my Webview is not loaded.
Is there another way to be sure that my Webview is loaded 100%?
This is a part of my code :
sdk.getWebView().loadDataWithBaseURL("notreal/", data_html,MIME_TYPE,ENCODING_UTF_8,null);
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run(){
Log.i("TAG", "progress fin = "+sdk.getWebView().getProgress());
if(sdk.getWebView().getProgress() <100){
//cancel the webView
sdk.getContext().runOnUiThread(new Runnable() {
@Override
public void run() {
sdk.getImgView().setVisibility(View.VISIBLE);
sdk.getWebView().setVisibility(View.GONE);
}
});
}
// else ,the Webview is loaded
else{
//prepare webview
sdk.getContext().runOnUiThread(new Runnable() {
@Override
public void run(){
// hide imageView
sdk.getImgView().setVisibility(View.GONE);
sdk.getWebView().setVisibility(View.VISIBLE);
}
});
}
}
};
timer.schedule(task, 5000);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
正如这里所说: 如何监听WebView加载完URL?~
As said here: How to listen for a WebView finishing loading a URL?~
检测页面是否已呈现的最佳方法是使用 onPageCommitVisible 回调,可从 API 23 获得。 onPageLoadFinished 不合适,因为它传递得太快(当处理 HTML 时,但是尚未渲染)。
The best way to detect if a page has rendered is to use the onPageCommitVisible callback, available from API 23. onPageLoadFinished is not suitable, since it's delivered too soon (when the HTML is processed, but not yet rendered).
您需要覆盖
WebViewClient
的onPageFinished
这是一个给您的示例
You need to overwrite the
onPageFinished
ofWebViewClient
Here is an example for you
您可以尝试扩展 WebChromeClient,覆盖
onProgressChanged(WebView view, int newProgress)
并使用setWebChromeClient(WebChromeClient)
方法将其注册到您的 WebView 上。这将使您的应用程序从您启动的附加线程中解放出来,该线程只是为了检查进度是否发生变化。使用回调,更简单。所以这是第一件事。另一个是,我也在尝试这种进度状态,并且得出了一些关于它的行为方式的结论:
stopLoading()
时,为 100%,总而言之,此进度条是 WebView 是否已完成加载网站的指示器,但就 WebKit 而言,而不是页面已完全下载。您必须记住,连接可能会崩溃,资源(图像、CSS、JS)可能由于某种原因无法加载,JavaScript 可以在页面完成加载时加载更多资源等。此进度无法告诉您网站是否内容是否完全加载,它告诉你WebView认为这应该是全部。
关于如何检查页面是否完全加载,我没有其他想法,我认为这是唯一的方法。
You can try to extend WebChromeClient, override
onProgressChanged(WebView view, int newProgress)
and register it on your WebView withsetWebChromeClient(WebChromeClient)
method. This will free your application from the additional thread that you are starting just to check whether progress changed. Use the callback, it is simpler. So that would be the first thing.Another one is that I was also experimenting with this progress status and I came to some conclusions about how it behaves:
stopLoading()
on your WebView,To sum up, this progress bar is an indicator on whether WebView has finished loading the site or not but in terms of WebKit not in terms of page being completely downloaded. You have to keep in mind that connection may crash, resources (images, css, js) may not load for some reason, JavaScript can load some more resources when page will finish up loading etc. this progress can't tell you if the sites content was fully loaded or not, it tells you that WebView thinks that this should be all.
I have no other ideas on how to check whether page was fully loaded or not, I think this is the only way.
上述解决方案对我来说不起作用,我想确保页面加载 100%,然后注入 javascript 对页面进行一些深入研究。我想出了以下解决方案,与 NeTeInStEiN 提供的解决方案几乎没有什么偏差。这可能并不适合每个人,但它对我有用。同样,这取决于您想要从完成的页面中实现什么目标。
希望这有帮助。
Above solutions did not work for me, I wanted to make sure I have page loaded 100% and then inject javascript to do some intensive research on the page. I came up with following solution with little deviation from the solution provided by NeTeInStEiN. This may not work for everyone but it worked for me. Again it depends on what you are trying to achieve from the finished page.
Hope This helps.
我也有一个解决方案,因为已经经历了加载完成后需要显示 webview 的情况。希望大家能够理解。
I also have a solution for that because already went through the condition where need to show webview after loading finish. Hope you guys understand it.
下面的代码完美运行。一旦页面加载成功,就会触发 onPageFinished()
The below code works perfectly. Once the page has been loaded successfully it will trigger onPageFinished()