在webview android我试图加载一个网址,以检查这个网址的加载是否成功(互联网连接可用,服务器已启动等)我的印象是webview.loadUrl会抛出例外,但错了!因为它明确地在here&#34中陈述;不会抛出异常"。
那么如何检查webview.loadUrl是否没有失败?
答案 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
}
}
});