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

标签 android webview android-webview

在 webview android 中,我正在尝试加载一个 url,为了检查这个 url 的加载是否成功完成(互联网连接可用,服务器已启动等)我的印象是 webview.loadUrl 会抛出异常(exception),但错误!正如在 here 中明确说明的那样“不会抛出异常”。

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

最佳答案

不幸的是,目前在 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());

如果服务器连接成功,并且主页已被检索和解析,您将收到 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.
    }
    ...
}

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

很少有开发人员意识到,非 https 方案的子帧也会调用回调。如果你遇到类似 <iframe src='tel:1234'> 的情况,你最终会执行 view.loadUrl('tel:1234')并且您的应用程序将显示错误页面,因为 WebView 不知道如何加载 tel:网址。 如果您希望 WebView 执行加载,建议从该方法简单地返回 false:

public class MyWebViewClient extends WebViewClient {
    ...

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

这并不意味着你不应该调用 WebView.loadUrl来自 shouldOverrideUrlLoading根本。要避免的特定模式是对所有 URL 无条件地这样做。

关于Android:使用 webview.loadUrl 时如何检查 url 是否成功加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385768/

相关文章:

android - 在一个应用程序中使用 2 个 map fragment 时出现问题

android - 如何在 Fragment 内的 WebView 中添加 "Go Back"函数?

android - "java.exe"在运行 xamarin.android 应用程序时退出并出现代码 1 错误

java - 每次查看 Activity 时如何调用方法?

java - 如何避免在 android Kitkat 4.4 中长按时默认选择?

ios - 添加 http ://prefix to UITextField in swift

android - 如何使用 webview 返回到父 Fragment?

android - 如何通过点击号码从 webviewclient 打开拨号器 Activity ?

Android WebView 请求焦点 : How to prevent scrolling to top?

android - 应用程序重启时的空白 fragment