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

Hou*_*ine 54 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 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);
Run Code Online (Sandbox Code Playgroud)

net*_*ein 80

如上所述:如何监听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; 
       }

    }
});
Run Code Online (Sandbox Code Playgroud)

  • 注意:这是*NOT*与"有webview呈现"相同... ...在获取加载和实际呈现之间仍然会有一点延迟 (4认同)
  • 它似乎工作,谢谢:),@ Houcine:感谢你的想法,非常有用. (2认同)

Dan*_*vak 9

检测页面是否已呈现的最好方法是使用API 23提供的onPageCommitVisible回调。onPageLoadFinished不适合使用,因为它交付的太早了(在处理HTML但尚未呈现时)。

webview.setWebViewClient(new WebViewClient() {

    @Override
     public void onPageCommitVisible (WebView view, 
            String url)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 迄今为止最好的答案 (2认同)
  • 我一直在使用一个页面运行一些测试,该页面从 JS 加载一些内容,并且在“onPageFinished”之前调用“onPageCommitVisible”。它们都是在页面实际完全加载之前调用的。 (2认同)

Tan*_*dal 6

你需要覆盖onPageFinishedWebViewClient

这是一个例子

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

        }


}
Run Code Online (Sandbox Code Playgroud)


Mac*_*ski 5

您可以尝试扩展 WebChromeClient,onProgressChanged(WebView view, int newProgress)使用setWebChromeClient(WebChromeClient)方法覆盖并在您的 WebView 上注册它。这将使您的应用程序从您开始检查进度是否更改的附加线程中解放出来。使用回调,比较简单。所以这将是第一件事。

另一个是我也在试验这种进度状态,我得出了一些关于它的行为的结论:

  • 对于某些用例(例如检查页面是否甚至在给定的 url 下),它必须大于 10。当 WebView 连接到提供的 url 时,它会自动将进度值设置为 10,即使它没有创建连接成功,如果大于10,就可以确定url可以访问,加载已经开始,
  • 当您调用stopLoading()WebView 时,进度将返回为 100% ,
  • 记住之前的一点,当 WebView 无法加载完整站点时(例如,它会为图像超时)然后它会报告该页面已完全加载(100%)

综上所述,这个进度条是一个WebView是否已经完成加载站点的指示器,但对于WebKit而言,不是页面完全下载的指示器。您必须记住,连接可能会崩溃,资源(图像、css、js)可能由于某种原因无法加载,JavaScript 可以在页面完成加载时加载更多资源等。此进度无法告诉您站点是否内容是否已完全加载,它告诉您 WebView 认为这应该是全部。

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


Raj*_*ami 5

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

                }
            }
        });
Run Code Online (Sandbox Code Playgroud)