当发生某些错误(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。
答案 0 :(得分:0)
正如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。
我希望有更好的方法来做到这一点...
答案 1 :(得分:0)
在onPageStarted
方法中检查URL是否失败。您可能需要将onReceivedError
方法中失败的URL保留在某个位置,以便在网络连接恢复或条件满足时可以加载它。
@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);
}
}
}
在reload
按钮的clickListener事件中,将失败的URL设置为null
reloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!viewModel.getFailingUrl()) {
webView.loadUrl(viewModel.getFailingUrl());
viewModel.setFailingUrl(null); // set the failing url to null
return;
}
webView.reload();
}
});