在WebView中加载自定义错误HTML文件的最佳方法

时间:2019-07-12 04:08:20

标签: java android webview

  1. 当发生某些错误(Internet断开连接,超时...)并将failingUrl保存在viewModel中时,会在Webview中加载自定义html页面。

  2. 按下重新加载按钮时,它将尝试重新加载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。

2 个答案:

答案 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();
        }
});