Android 我怎么知道我的WebView已100%加载?
我试图在我的WebView中加载一些包含JavaScript的HTML代码 现在,我想测试我的WebView是否在5秒钟之前加载。我尝试了方法Android 我怎么知道我的WebView已100%加载?,android,android-webview,Android,Android Webview,我试图在我的WebView中加载一些包含JavaScript的HTML代码 现在,我想测试我的WebView是否在5秒钟之前加载。我尝试了方法getProgress(),但有时我发现进度是100,但我的Webview没有加载。 是否有其他方法确保我的Webview加载100% 这是我代码的一部分: sdk.getWebView().loadDataWithBaseURL("notreal/", data_html,MIME_TYPE,ENCODING_UTF_8,null); Timer ti
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);
sdk.getWebView().loadDataWithBaseURL(“notreal/”,数据\ html,MIME \类型,编码\ UTF \ 8,空);
定时器=新定时器();
TimerTask任务=新的TimerTask(){
@凌驾
public void run(){
Log.i(“TAG”、“progress fin=“+sdk.getWebView().getProgress());
如果(sdk.getWebView().getProgress()如此处所述:
您需要覆盖WebViewClient
这里有一个例子
private class Callback extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//do what you want to do
}
}
您可以尝试扩展WebChromeClient,覆盖onProgressChanged(WebView视图,int newProgress)
并使用setWebChromeClient(WebChromeClient)在您的WebView上注册它
method。这将使您的应用程序从额外的线程中解放出来,您只需开始检查进度是否发生了变化。使用回调,这更简单。因此,这将是第一件事
另一个原因是,我也在试验这种进展状态,我得出了一些关于其行为的结论:
- 对于某些用例(例如检查页面是否在给定url下)它必须大于10。当WebView连接到提供的url时,它会自动将进度值设置为10,即使它没有成功连接,如果它大于10,则可以确保可以访问url并开始加载
- 在WebView上调用
stopLoading()
时,进度将以100%返回
- 请记住上一点,当WebView无法加载整个站点时(例如,它将获得图像超时),它将报告页面已完全加载(100%)
总而言之,此进度条是WebView是否已完成站点加载的指示器,但它是指WebKit,而不是指页面是否已完全下载。您必须记住,连接可能会崩溃,请参阅参考资料(图像、css、js)由于某些原因可能无法加载,JavaScript可以在页面完成加载时加载更多的资源,等等。这个过程不能告诉您站点内容是否已完全加载,它告诉您WebView认为这应该是全部
关于如何检查页面是否已完全加载,我没有其他想法,我认为这是唯一的方法。上述解决方案对我不起作用,我想确保页面已加载100%,然后注入javascript对页面进行深入研究。我提出了以下解决方案,与解决方案几乎没有偏差这可能不适用于所有人,但适用于我。同样,这取决于你试图从完成的页面中获得什么
String url; is from your activity which want to load this url
private class ExtendedWebViewClient extends WebViewClient {
private int webViewPreviousState;
private final int PAGE_STARTED = 0x1;
private final int PAGE_REDIRECTED = 0x2;
public void onPageStarted(WebView paramWebView, String paramString,
Bitmap paramBitmap) {
super.onPageStarted(paramWebView, paramString, paramBitmap);
if(paramString.contentEquals(url)) {
webViewPreviousState = PAGE_STARTED;
} else {
webViewPreviousState = PAGE_REDIRECTED;
}
// DO YOU STUFF IF NEEDED
}
public void onPageFinished(WebView paramWebView, String paramString) {
if (webViewPreviousState == PAGE_STARTED) {
// I AM GETTING HERE WHEN MY PAGE IS LOADED 100%
// NOW ITS TIME FOR ME TO RUN JAVASCRIPT FUNCTIONS
// DO YOUR STUFF
}
}
希望这有帮助。下面的代码工作得很好。一旦页面成功加载,它将触发onPageFinished()
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
//do your task
}
}
});
检测页面是否已呈现的最佳方法是使用API 23中提供的回调。onPageLoadFinished不适用,因为它传递得太快(当HTML已处理但尚未呈现时)
为WebView设置WebChromeClient—确定页面加载完成时间的另一种方法
mWebView.setWebChromeClient(new WebChromeClient(){
/*public void onProgressChanged (WebView view, int newProgress) Tell the host application the current progress of loading a page.
Parameters
view WebView: The WebView that initiated the callback.
newProgress int: Current page loading progress, represented by an
integer between 0 and 100.
*/
public void onProgressChanged(WebView view, int newProgress){
Toast.makeText(getActivity().getApplicationContext(),"Page loading : " + newProgress + "%",Toast.LENGTH_SHORT).show();
if(newProgress == 100){
// Page loading finish
Toast.makeText(getActivity().getApplicationContext(),"Page loaded",Toast.LENGTH_SHORT).show();
}
}
});
我也有一个解决方案,因为已经经历了需要在加载完成后显示webview的情况。希望你们理解
webview.loadUrl(url)
webview.webViewClient = object : WebViewClient() {
override fun onPageCommitVisible(view: WebView?, url: String?) {
webview.visibility = View.GONE
// your method to call the css and load it into the existing webview
loadCSS()
super.onPageCommitVisible(view, url)
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
if (webview.progress == 100) {
webview.visibility = View.VISIBLE
}
progressBar.visibility = View.GONE
}
}
谢谢你的回复,但我没有加载URL,我加载的是HTML代码,你认为它对我的案例有效吗?好的,我已经修复了它,该方法的原型如下:onPageStarted(WebView-WebView,String-URL,Bitmap-favicon)
它似乎有效,谢谢:),@Houcine:谢谢您的想法,非常有用。请注意,onPageFinished
在加载任何具有async
属性集的脚本之前触发。因此,页面可能没有完成。注意:这与“has webview rendered”不同…在加载和实际呈现之间,您仍然会有一点延迟感谢您的回复,但我没有加载URL,我加载的是HTML代码,您认为它对我的案例有效吗?在这种情况下,页面可能会加载错误,但仍然可以完成加载。可能会重复感谢您的附加注释!forma更好的是,还要解释一下为什么这样做。即使页面没有100%完成加载,onPageFinished也可能会调用它,这比使用WebViewClient的onPageFinished()要好。问题是“如果我的WebView已加载…”onProgressChanged显示进度100%,即使url失败(未下载)。到目前为止最好的答案根据链接文档,它是在最早的时间点调用的,可以保证WebView#onDraw不再从以前的导航中提取任何内容。下一次提取将显示WebView的WebView#setBackgroundColor或新加载页面的一些内容。因此,在我调用t时,无法保证页面已完全加载。我已经使用一个页面运行了一些测试,该页面从JS加载了一些内容,并且onPageCommitVisible
是在onPageFinished
之前调用的。这两个测试都是在页面实际完全加载之前调用的。
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageCommitVisible (WebView view,
String url)
}
}
mWebView.setWebChromeClient(new WebChromeClient(){
/*public void onProgressChanged (WebView view, int newProgress) Tell the host application the current progress of loading a page.
Parameters
view WebView: The WebView that initiated the callback.
newProgress int: Current page loading progress, represented by an
integer between 0 and 100.
*/
public void onProgressChanged(WebView view, int newProgress){
Toast.makeText(getActivity().getApplicationContext(),"Page loading : " + newProgress + "%",Toast.LENGTH_SHORT).show();
if(newProgress == 100){
// Page loading finish
Toast.makeText(getActivity().getApplicationContext(),"Page loaded",Toast.LENGTH_SHORT).show();
}
}
});
webview.loadUrl(url)
webview.webViewClient = object : WebViewClient() {
override fun onPageCommitVisible(view: WebView?, url: String?) {
webview.visibility = View.GONE
// your method to call the css and load it into the existing webview
loadCSS()
super.onPageCommitVisible(view, url)
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
if (webview.progress == 100) {
webview.visibility = View.VISIBLE
}
progressBar.visibility = View.GONE
}
}