不幸的是,目前在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.onPageStarted和WebViewClient.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模式的子帧。如果您遇到像这样的内容,您将最终执行view.loadUrl('tel:1234'),并且您的应用将显示错误页面,因为WebView不知道如何加载tel: URL。 建议简单地从方法返回false,如果你想要的WebView做负载:
public class MyWebViewClient extends WebViewClient {
...
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// Returning 'false' unconditionally is fine.
return false;
}
...
}
这并不意味着你不应该从shouldOverrideUrlLoading调用WebView.loadUrl可言。要避免的具体模式是无条件地为所有URL执行此操作。