不幸的是,目前在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方案的子帧.如果您遇到类似< 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;
}
...
}
这并不意味着您根本不应该从shouldOverrideUrlLoading调用WebView.loadUrl.要避免的具体模式是对所有URL无条件地执行此操作.