当发生某些错误(Internet断开连接,超时...)并且failingUrl保存在viewModel中时,会在webview中加载自定义html页面。
当按下重新加载按钮时,它将尝试重新加载failingUrl。
问题是每次我加载自定义html文件时,都会在onPageStarted中再次调用该文件,并清除failingUrl。因此failingUrl将为null。调用onPageStarted时,如何知道它是否是错误页面?
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
//clear failingUrl
viewModel.setFailingUrl(null);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
String htmlData ="<html><body>" + "ErrorNo: " + errorCode + "</body></html>";
view.loadDataWithBaseURL(failingUrl, htmlData, "text/html", "UTF-8", failingUrl);
//save failingUrl
viewModel.setFailingUrl(failingUrl);
}
});
reloadButton:
reloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!viewModel.getFailingUrl()) {
webView.loadUrl(viewModel.getFailingUrl());
return;
}
webView.reload();
}
});
单击reloadButton时可以清除failingUrl,但这不是一个好主意。因为如果在webView恢复正常时更改URL,然后按reloadButton,它将重新加载failingUrl。
最佳答案
正如Rahul Khurana所说,检查它是否是onPageStarted中的failingUrl。
我这样做:
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (viewModel.getFailingUrl != null) {
if (!viewModel.getFailingUrl().equals(url)) {
viewModel.setFailingUrl(null);
}
}
}
然后在onClickListener中:
reloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!viewModel.getFailingUrl()) {
webView.loadUrl(viewModel.getFailingUrl());
//added
viewModel.setFailingUrl(null);
return;
}
webView.reload();
}
});
看来行得通!如果用户加载的新URL与failingUrl不同,则在按下重新加载按钮时将不会加载failingUrl。
而且,如果用户尝试在webView中没有错误时尝试重新加载failingUrl,则用户将重新加载failingUrl并清除failingUrl。
我希望有更好的方法来做到这一点...