Android:如何在使用webview.loadUrl时检查url是否成功加载

时间:2015-02-07 18:26:47

标签: android webview android-webview

在webview android我试图加载一个网址,以检查这个网址的加载是否成功(互联网连接可用,服务器已启动等)我的印象是webview.loadUrl会抛出例外,但错了!因为它明确地在here&#34中陈述;不会抛出异常"。

那么如何检查webview.loadUrl是否没有失败?

4 个答案:

答案 0 :(得分:14)

不幸的是,目前WebView中没有简单的方法可以确保页面上的所有内容都已成功加载。我们希望在未来版本中提供更好的API。让我解释一下你现在可以做些什么。

首先,为了检测阻止WebView连接到服务器以加载主页的任何问题(例如,错误的域名,I / O错误等),您应该使用{{1} }回调正如其他人正确建议的那样:

WebViewClient.onReceivedError

如果服务器连接成功,并且检索并解析了主页面,您将收到public class MyWebViewClient extends WebViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Make a note about the failed load. } } myWebView.setWebViewClient(new MyWebViewClient()); 回调,因此您还需要在WebView.onPageFinished子类中进行此操作:

WebViewClient

这里需要注意的是,如果您从服务器收到HTTP错误(例如404或500错误),那么无论如何都会调用此回调,这只是您在WebView中获得的内容将是服务器错误页面。人们提出了如何处理它的不同方法,请看这里的答案:How can I check from Android WebView if a page is a "404 page not found"?基本上,它实际上取决于你期望的“好”页面和“错误”页面。不幸的是,目前该应用程序无法从WebView获取HTTP响应代码。

回调public class MyWebViewClient extends WebViewClient { ... @Override public void onPageFinished(WebView view, String url) { // Make a note that the page has finished loading. } ... } WebViewClient.onPageStarted仅在您要加载页面时绘制进度条时才有用。

另请注意,人们通常建议的覆盖WebViewClient.onProgressChanged的方式不正确:

WebViewClient.shouldOverrideUrlLoading

少数开发人员意识到,对于具有非https方案的子帧,也会调用回调。如果您遇到public class MyWebViewClient extends WebViewClient { ... @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // !!! DO NOT DO THIS UNCONDITIONALLY !!! view.loadUrl(url); return true; } ... } 之类的内容,最终会执行<iframe src='tel:1234'>,您的应用会显示错误页面,因为WebView不知道如何加载view.loadUrl('tel:1234')网址。 如果您希望WebView执行加载,建议只从方法返回false:

tel:

这并不意味着您根本不应该从public class MyWebViewClient extends WebViewClient { ... @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // Returning 'false' unconditionally is fine. return false; } ... } 致电WebView.loadUrl。要避免的具体模式是对所有URL无条件地执行此操作。

答案 1 :(得分:3)

public class AppWebViewClient extends WebViewClient {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
            setProgressBar(true);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            //Page load finished
            super.onPageFinished(view, url);
            setProgressBar(false);
        }
}

然后你可以做

webView.setWebViewClient(new AppWebViewClient());

对于错误部分,您可以覆盖onReceivedError方法

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        // TODO Auto-generated method stub
        super.onReceivedError(view, errorCode, description, failingUrl);
}

答案 2 :(得分:0)

这是我想出的,就像一个发饰一样

    Boolean failedLoading = false;
    WebView webView = view.findViewById(R.id.webView);
    webView.loadUrl("www.example.com");
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (!failedLoading) {
                webView.setVisibility(View.VISIBLE);
                webView.setAlpha(0f);
                ObjectAnimator anim  = ObjectAnimator.ofFloat(webView, "alpha",1f);
                anim.setDuration(500);
                anim.start();
            }
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            failedLoading = true;
        }
    });

如果您有某种刷新按钮,效果也很好,那么您可以在函数中调用上面的代码再试一次:)

答案 3 :(得分:-1)

您可以使用onProgressChanged()

检查是否已成功加载网址
mWebView.setWebChromeClient(new WebChromeClient() {

         public void onProgressChanged(WebView view, int progress) {
                progressBar.setProgress(progress);
                if (progress == 100) {
                    //your url is loaded successfully 
                }
            }
    });