android 我如何知道我的WebView已加载100%?

xqnpmsa8  于 2023-06-04  发布在  Android
关注(0)|答案(9)|浏览(157)

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

nwsw7zdq1#

正如这里所说:如何侦听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; 
        }

    }
});
pw9qyyiw

pw9qyyiw2#

检测页面是否已呈现的最佳方法是使用onPageCommitVisible回调,可从API 23获得。onPageLoadFinished不合适,因为它交付得太快(当HTML被处理,但尚未呈现时)。

webview.setWebViewClient(new WebViewClient() {

    @Override
     public void onPageCommitVisible (WebView view, 
            String url)
    }
}
wwwo4jvm

wwwo4jvm3#

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

                }
            }
        });
ryevplcw

ryevplcw4#

您需要覆盖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

        }

}
von4xj4u

von4xj4u5#

您可以尝试扩展WebChromeClient,覆盖onProgressChanged(WebView view, int newProgress)并使用setWebChromeClient(WebChromeClient)方法在WebView上注册它。这将使您的应用程序从额外的线程中解放出来,您正在启动该线程来检查进度是否发生了变化。使用callback,它更简单。所以这将是第一件事。
另一个是,我也在试验这种进展状态,我得出了一些关于它如何表现的结论:

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

总而言之,这个进度条是WebView是否完成了网站加载的指示器,但就WebKit而言,并不是页面被完全下载。你必须记住,连接可能会崩溃,资源(images,css,js)可能由于某种原因无法加载,JavaScript可以加载更多的资源,当页面将完成加载等。这个进度不能告诉你网站内容是否已完全加载,它告诉你WebView认为这应该是全部。
我没有其他的想法如何检查页面是否已完全加载或没有,我认为这是唯一的方法。

2j4z5cfb

2j4z5cfb6#

为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();
            }
                }
            });
vdgimpew

vdgimpew7#

上述解决方案对我不起作用,我想确保页面加载100%,然后注入JavaScript对页面进行深入研究。我想出了以下解决方案,与NeteInStEiN提供的解决方案几乎没有偏差。这可能不是对每个人都有效,但它对我有效。同样,这取决于你想从完成的页面中获得什么。

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

希望这能有所帮助。

qyuhtwio

qyuhtwio8#

我也有一个解决方案,因为已经通过了加载完成后需要显示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
        }
    }
wsewodh2

wsewodh29#

下面的代码运行得很好。一旦页面加载成功,它将触发onPageFinished()

webView.setWebViewClient(new 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);
        }
    });

相关问题