我怎么知道我的WebView被加载100%?

我试图在我的WebView中加载一些包含JavaScript的HTML代码。

现在,我想testing我的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); 

如这里所说: 如何听WebView完成加载一个URL?

 boolean loadingFinished = true; boolean redirect = false; mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) { if (!loadingFinished) { redirect = true; } loadingFinished = false; view.loadUrl(urlNewString); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap facIcon) { loadingFinished = false; //SHOW LOADING IF IT ISNT ALREADY VISIBLE } @Override public void onPageFinished(WebView view, String url) { if(!redirect){ loadingFinished = true; } if(loadingFinished && !redirect){ //HIDE LOADING IT HAS FINISHED } else{ redirect = false; } } }); 

您需要覆盖WebViewClientonPageFinished

这里是你的一个例子

 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 view, int newProgress)并使用setWebChromeClient(WebChromeClient)方法在WebView上注册它。 这将从您正在启动的附加线程释放您的应用程序,只是检查进度是否改变。 使用callback,更简单。 所以这将是第一件事。

另外一个就是我也在试验这个进展情况,并得出了一些结论:

  • 对于一些使用情况(例如检查页面是否在给定的url下),它必须大于10.当WebView连接到提供的url时,它会自动设置进度值为10,即使它没有做出成功的连接,如果它大于10,那么你可以确定URL可以访问和加载已经开始,
  • 当您在WebView上调用stopLoading()时,进度将被返回为100%
  • 当WebView无法加载完整的网站(例如,它会得到一个图像超时),那么它会报告该网页已完全加载(100%)

总结一下,这个进度条是WebView是否已经完成加载网站的一个指标,但是在WebKit方面并不是完全下载网页。 你必须记住,连接可能会崩溃,资源(图像,CSS,JS)可能无法加载由于某种原因,JavaScript可以加载一些更多的资源,当页面将完成加载等这个进展不能告诉你,如果网站内容是完全加载或没有,它告诉你,WebView认为这应该是所有。

关于如何检查页面是否完全加载,我没有其他的想法,我认为这是唯一的方法。

以上的解决scheme并不适合我,我想确保我有页面加载100%,然后注入JavaScript做一些深入的研究在页面上。 我提出了以下解决scheme,与NeTeInStEiN提供的解决scheme几乎没有任何偏差。 这可能不适用于每个人,但它为我工作。 这又取决于你想从完成的页面中获得什么。

 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 } } 

希望这可以帮助。

 webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { if (progress == 100) { //do your task } } }); 

webView.setWebViewClient(新的WebViewClient(){

  @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Toast.makeText(getApplicationContext(),"Started",Toast.LENGTH_SHORT).show(); super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Toast.makeText(getApplicationContext(),"Loaded",Toast.LENGTH_SHORT).show(); super.onPageFinished(view, url); } });