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

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

我试图在我的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);
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
        }
    }