Android WebView WebChromeClient:onProgressChanged()中的进度值不准确

tam*_*ler 5 android webview webchromeclient

我需要访问WebView中的进度值 - > WebChromeClient - > onProgressChanged().进度整数值不会从0增加到100,而是跳转.以下是加载一个页面的示例日志输出和相关的进度编号:

DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 30
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 30
DEBUG:  progress : 100
DEBUG:  progress : 10
DEBUG:  progress : 30
DEBUG:  progress : 37
DEBUG:  progress : 45
DEBUG:  progress : 48
DEBUG:  progress : 49
DEBUG:  progress : 50
DEBUG:  progress : 52
DEBUG:  progress : 54
DEBUG:  progress : 56
DEBUG:  progress : 59
DEBUG:  progress : 61
DEBUG:  progress : 63
DEBUG:  progress : 66
DEBUG:  progress : 68
DEBUG:  progress : 70
DEBUG:  progress : 73
DEBUG:  progress : 75
DEBUG:  progress : 77
DEBUG:  progress : 79
DEBUG:  progress : 82
DEBUG:  progress : 84
DEBUG:  progress : 86
DEBUG:  progress : 87
DEBUG:  progress : 88
DEBUG:  progress : 89
DEBUG:  progress : 100
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

码:

webView.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress) {
        Log.i(LOG_TAG, "DEBUG: progress : " + progress);
    }
});
Run Code Online (Sandbox Code Playgroud)

Jua*_*edo 5

根据我自己的实验,我发现onProgressChanged可以针对相同的进度值多次调用相同的URL(例如:google.com progress = 100次调用两次).

我还发现在你加载另一个url时,onProgressChanged将被调用为一个url.时间表示例:

  1. 加载google.com
  2. ProgressChanged = 100,webView.geturl():google.com
  3. 加载amazon.com
  4. ProgressChanged = 40,webView.getUrl():amazon.com
  5. ProgressChanged = 100,webView.getUrl():google.com

在这一点上,我应该提一下,在我的实验中,我重写了shouldOverrideUrlLoading()以查看重定向,即使我没有看到重定向,上面仍然会发生.那么为什么会这样呢?

根据这个答案(为什么WebChromeClient.onProgressChanged和jquery的$(document).ready()回调之间有明显的延迟?):因为在触发脚本之前加载了一个页面,所以文档就绪会查找要加载的所有html元素首先除了图像和类似的东西,所以你的脚本在所有内容都被加载之前不会触发,到那时你的onprogresschanged首先收到100%,因为它可能比你的javascript更高优先级,因为所有设备都要求检查是否js应该允许或不允许,因此在调用此方法之前必须经过一些检查.

所以要把它们放在一起这就是你需要做的:

  1. 不要相信onProgressChanged().
  2. onPageStarted()检查您尝试加载的当前URL是否与webView.getUrl()匹配.这是你的出发点.将boolean finishedLoading设置为false.
  3. 假设在调用onPageFinished时加载页面,并且webView.getUrl()与您尝试加载的URL匹配.如果没有重定向,则将finishedLoading标志设置为true.但是,对于重定向,您需要按照步骤3进行操作.
  4. overrideOverrideurlLoading().如果新url与最初加载的url(webView.loadUrl(new redirect url))不匹配,则加载新url并将finishedLoading设置为false.

    private boolean isCurrentUrl(String url){
        return url.toLowerCase().contains(currentUrl.toLowerCase());
    }

   public void onPageStarted(WebView webView, String url,     
       android.graphics.Bitmap bitmap){

                if (isCurrentUrl(url)){
                    pageLoaded = false;
                }
   }

   public void onPageFinished(WebView webview, String url){
       if (isCurrentUrl(url)){
           pageLoaded = true;
       }
   }

   public boolean shouldOverrideUrlLoading(WebView view, String 
       url){
       if (!currentUrl.equalsIgnoreCase(url)){
           currentUrl = url;
           view.loadUrl(currentUrl);
           return true;
       }
       return false;
   }
Run Code Online (Sandbox Code Playgroud)


tam*_*ler 2

正如 @ksasq 在上面的评论中指出的那样,初始 URL 导致了许多重定向,因此 onProgressChanged() 被调用了很多次。