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

C g*_*ics 13 android webview android-webview

在webview android我试图加载一个网址,以检查此网址的加载是否成功(互联网连接可用,服务器已启动等)我的印象是webview.loadUrl会抛出异常,但错误!因为它在这里明确说明"不会抛出异常".

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

Mik*_*nov 15

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

首先,为了检测阻止WebView连接到服务器以加载主页的任何问题(例如,错误的域名,I/O错误等),您应该使用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());
Run Code Online (Sandbox Code Playgroud)

如果服务器连接成功,并且检索并解析了主页面,则会收到WebView.onPageFinished回调,因此您还需要在WebViewClient子类中使用此方法:

public class MyWebViewClient extends WebViewClient {
    ...
    @Override
    public void onPageFinished(WebView view, String url) {
        // Make a note that the page has finished loading.
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这里需要注意的是,如果您从服务器收到HTTP错误(例如404或500错误),则无论如何都会调用此回调,只是您在WebView中获得的内容将是服务器错误页面.人们建议如何处理它的不同方法,请参阅此处的答案:如果页面是"未找到404页面",我如何从Android WebView查看?基本上,它实际上取决于您期望的"好"页面和"错误"页面.不幸的是,目前该应用程序无法从WebView获取HTTP响应代码.

回调WebViewClient.onPageStartedWebViewClient.onProgressChanged,如果你想画一个进度条为您加载的页面是唯一有用的.

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

public class MyWebViewClient extends WebViewClient {
    ...
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)         {  
        // !!! DO NOT DO THIS UNCONDITIONALLY !!!
        view.loadUrl(url);
        return true;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

少数开发人员意识到,回调也被称为具有非https方案的子帧.如果你遇到类似的问题<iframe src='tel:1234'>,你将最终执行view.loadUrl('tel:1234'),你的应用程序将显示错误页面,因为WebView不知道如何加载tel:URL.如果您希望WebView进行加载,建议只从方法返回false:

public class MyWebViewClient extends WebViewClient {
    ...

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)         {
        // Returning 'false' unconditionally is fine.
        return false;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这并不意味着你不应该叫WebView.loadUrlshouldOverrideUrlLoading根本.要避免的具体模式是对所有URL无条件地执行此操作.


Bha*_*hta -1

您可以使用以下命令检查 URL 是否加载成功onProgressChanged()

mWebView.setWebChromeClient(new WebChromeClient() {

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

  • **这不行**,即使加载失败,进度也会达到100。@Mikhail Naganov 的答案可能是最好的答案。 (3认同)