jjzjj

Android WebView WebChromeClient : inaccurate progress value in onProgressChanged()

coder 2023-12-10 原文

我需要在 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

我做错了什么?

代码:

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

最佳答案

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

我还发现当您加载另一个 url 时,onProgressChanged 将被延迟调用。时间表示例:

  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() 以查看重定向,即使我没有看到重定向,上述情况仍然会发生。那么为什么会这样呢?

根据这个答案(Why is there a noticeable delay between WebChromeClient.onProgressChanged and jquery's $(document).ready() callbacks?):因为页面在脚本被触发之前加载,文档就绪查找所有要首先加载的 html 元素,除了图像和类似的东西,所以你的脚本直到一切都不会触发已经加载,到那时你的 onprogresschanged 已经首先收到 100%,因为它可能比你的 javascript 具有更高的优先级,因为在所有设备都要求检查是否应该允许 js 之后,它必须在这个方法之前经过一些检查被称为。

所以要将它们放在一起,这就是您需要做的:

  1. 不要相信 onProgressChanged()。
  2. onPageStarted() 检查您尝试加载的当前 url 是否与 webView.getUrl() 匹配。这是你的起点。将 bool 值 finishedLoading 设置为 false。
  3. 假设调用 onPageFinished 时您的页面已加载,并且 webView.getUrl() 与您尝试加载的 url 匹配。如果没有重定向,则将 finishedLoading 标志设置为 true。但是,对于重定向,您需要执行第 3 步。
  4. 覆盖 shouldOverrideurlLoading()。如果新网址与最初加载的网址不匹配,则加载新网址 (webView.loadUrl(new redirect 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;
   }

关于Android WebView WebChromeClient : inaccurate progress value in onProgressChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212271/

有关Android WebView WebChromeClient : inaccurate progress value in onProgressChanged()的更多相关文章

随机推荐