为了账号安全,请及时绑定邮箱和手机立即绑定

如何侦听WebView完成加载URL?

如何侦听WebView完成加载URL?

明月笑刀无情 2019-06-24 15:30:19
如何侦听WebView完成加载URL?我有一个WebView从互联网上加载页面。我想展示一个ProgressBar直到装货完成。如何侦听完成WebView?
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

延展WebViewClient打电话onPageFinish()如下:

mWebView.setWebViewClient(new WebViewClient() {

   public void onPageFinished(WebView view, String url) {
        // do your stuff here
    }});


查看完整回答
反对 回复 2019-06-24
?
郎朗坤

TA贡献1921条经验 获得超9个赞

这并不是百分之百准确。如果一个页面中有几个iframes,那么就会有多个onPageFinish(和onPageStarted)。如果您有几个重定向,它也可能失败。这种方法解决了(几乎)所有的问题:

boolean loadingFinished = true;boolean redirect = false;mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
        if (!loadingFinished) {
            redirect = true;
        }

        loadingFinished = false;
        webView.loadUrl(urlNewString);
        return true;
    }

    @Override
    public void onPageStarted(WebView view, String url) {
        loadingFinished = false;
        //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        if (!redirect) {
           loadingFinished = true;
            //HIDE LOADING IT HAS FINISHED
        } else {
            redirect = false; 
        }
    }});

最新情况:

根据文档:当嵌入式框架的内容发生变化时,即单击目标为iframe的链接时,将不会调用onPageStarted。

我在Twitter上发现了一个特殊的例子,在Twitter上,只有一个页面被调用,逻辑有点混乱。为了解决这个问题,我在X秒之后添加了一个预定任务来删除加载。这并不是所有其他情况下都需要的。

更新2:

现在,使用当前的AndroidWebView实现:

boolean loadingFinished = true;boolean redirect = false;

    mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(
                WebView view, WebResourceRequest request) {
            if (!loadingFinished) {
               redirect = true;
            }

            loadingFinished = false;
            webView.loadUrl(request.getUrl().toString());
            return true;
        }

        @Override
        public void onPageStarted(
                WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            loadingFinished = false;
            //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (!redirect) {
               loadingFinished = true;
                //HIDE LOADING IT HAS FINISHED
            } else {
                redirect = false; 
            }
        }
    });


查看完整回答
反对 回复 2019-06-24
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

我非常喜欢@NeTeInSteiN(和@Polen)解决方案,但我会用一个计数器来实现它,而不是多个布尔人或州观察者(只是另一种口味,但我认为这可能有共同之处)。它确实有一个JS的细微差别,但我觉得逻辑更容易理解。

private void setupWebViewClient() {
    webView.setWebViewClient(new WebViewClient() {
        private int running = 0; // Could be public if you want a timer to check.

        @Override
        public boolean shouldOverrideUrlLoading(WebView webView, String urlNewString) {
            running++;
            webView.loadUrl(urlNewString);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            running = Math.max(running, 1); // First request move it to 1.
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if(--running == 0) { // just "running--;" if you add a timer.
                // TODO: finished... if you want to fire a method.
            }
        }
    });}


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 1060 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信